文字と文字列 解答ページ | Programming Place Plus C言語編 第8章

トップページC言語編第8章

問題①

問題① 次の文字は基本文字集合に含まれますか?


? だけが基本文字集合に含まれています。これは、どんな環境でも使用できる文字です。

はいわゆる全角文字ですが、このような文字は基本文字集合にはありません。

$@ はいずれも基本文字集合に含まれていません。

問題②

問題② 'a'"a" の違いを説明してください。


'a' は、シングルクォーテーション(’) で囲っているので、文字定数の a です。文字定数は int型であり、1つの文字 a を表現しています。

"a" は、ダブルクォーテーション(") で囲っているので、文字列リテラルの a です。文字列リテラルは、0文字以上の文字列を書き表せますが、たまたま1文字だけだったということです。文字列リテラルは char型の配列で、ヌル文字があるため、要素数は 2 です。

文字列リテラルを char型の配列の初期化に使うことはできますが、単体の char型の変数の初期化に使うことは不適切です。

char s[] = "a";  // OK. "a" + ヌル文字
char c = "a";    // 正しくない
char c2 = 'a';   // OK

char c = "a"; は意味的に不適切ですが、コンパイルは通ります。

問題③

問題③ 次のプログラムの実行結果はどうなりますか?

#include <stdio.h>

int main(void)
{
    char s1[] = "\\n";
    char s2[] = "\"\"";
    char s3[] = "\'";

    puts(s1);
    puts(s2);
    puts(s3);
}


"\\n" は、\\ の部分がエスケープシーケンスになっており、1つの \ になります。最後の n\ とはペアにならず、単なる n と扱われます。

"\"\"" は、\" がエスケープシーケンスになっており、1つの " になります。これが2回連続で登場するので、"" です。

"\'" は、\' がエスケープシーケンスになっており、1つの ' になります。実のところ、文字列リテラル内では ' は普通に書けるので、エスケープシーケンスを使う必要はありません。このエスケープシーケンスが必要になるのは、文字リテラルに ' を記述したいときです。

ということで、実行結果はこうなります。

\n
""
'

問題④

問題④ 次のプログラムで、変数 c に入る文字は何ですか?

#include <stdio.h>

int main(void)
{
    char s[] = "\nHello\n";
    char c = s[0];
}


エスケープシーケンスは見た目に反して、1文字あつかいであることに注意してください。s[0] にあるのは \n です。

ですから、変数 c に入る文字は \n です(つまり改行)。

問題⑤

問題⑤ 文字の入力を受け取り、その文字を整数で表したときの値を出力するプログラムを作成してください。


たとえば、次のようになります。

#include <stdio.h>

int main(void)
{
    puts("Please enter the character.");
    char s[20];
    fgets(s, sizeof(s), stdin);

    printf("%d\n", s[0]);
}

実行結果:

Please enter the character.
a    <-- 入力した文字
97

受け取りたい内容が1文字だけの場合でも、fgets関数を使って文字列として受け取ればいいです。

受け取った文字を、printf関数の “%d”変換指定子で出力してやれば、その文字の整数での表現が出力できます。


参考リンク


更新履歴

’2018/6/15 新規作成。



第8章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る