52. 文字列 文字はコンピュータの内部では数値 (コード) として記憶される

52. 文字列
文字はコンピュータの内部では数値 (コード) として記憶されるので、一つの記憶場所に一文字しかき
おくできない。そこで "daito" などの文字列を扱う場合は文字型 (char 型) の配列を用いる。
型
種類
入・出力書式
注意
(一) 文字
char 型
変数
%c
入力時に & と変数名、出力時は変数名を指定
文字列
char 型
配列
%c
入・出力時に配列名を指定
#include <stdio.h>
実行例
int main()
{
char line[100], c;
# ./a.exe
Enter(character) : 1
Enter(strings) : hundred
===1---hundred==
# ./a.exe
printf("Enter(character) : ");
scanf("%c", &c);
Enter(character) : a
printf("Enter(strings) : ");
scanf("%s", line);
Enter(strings) : big
===a---big==
boy
printf("===%c---%s==\n", c, line);
文字や文字列の前後にイコール記号やマイナス記号を
return 0;
出力して範囲を明示している。
}
char line[100]; と宣言し、scanf("%s", line); を実行するときに「Daito
配列
line[0]
line[1]
line[2]
line[3]
line[4]
line[5]
値
’D’
’a’
’i’
’t’
’o’
’\0’
」と入力すると、
(実際は整数値)
と記憶される。\0 は文字列終了文字で、\n, \t と同様に一文字である。
#include <stdio.h>
char 型の配列 line は大きさが 100 なので、実際には
100 個の記憶場所が用意される。
文字列を記憶するときは line[0] から一文字ずつ記憶
し、最後に’\0’ が追加されるので、文字列の「文字数
+1」個の記憶場所しか使わない。
int main()
{
char line[100];
int i;
printf("%s\n", line);
printf("Enter(strings) : ");
scanf("%s", line);
を実行すると、line[0] から ’\0’ が記憶されている
直前までに記憶されている整数に対応する文字がこの
順に出力されたあとに改行文字が出力される。
for (i = 0; line[i] != ’\0’; i++) {
printf("%3c, ", line[i]);
}
例えば配列 line の各値が上の表のようなとき、line[0]
∼line[4] に対応する文字 D, a, i, t, o がこの順で出
力されるので、
「Daito(改行文字)」となる。
printf("\n");
for (i = 0; line[i] != ’\0’; i++) {
printf("%3d, ", line[i]);
}
実行例
# ./a.exe
Enter(strings) : Daito
D,
a,
i,
t,
o,
68, 97, 105, 116, 111,
printf("\n");
return 0;
}
25
53. scanf と fgets
書式 (fgets)
実行例
fgets(name, size, fp);
# ./a.exe
name … 配列名
size … 大きさ
fp
… ファイル識別子
Enter (fgets) : Daito Univ.
(fgets)===Daito Univ.
===
D,
a,
i,…(中略)…
i,
v,
68, 97, 105,…(中略)… 105, 118,
空白を含んだ文字列を入力する時は fgets を用
いるとよい。
\n,
10,
Enter (scanf) : Daito Univ.
(scanf)===Daito===
D,
a,
i,
t,
o,
68, 97, 105, 116, 111,
エラー処理も考える場合は、
条件式「 fgets(...)
.,
46,
== NULL」
を用い、この条件式が真のときにエラー処理を
行う。
「Daito Univ.
」という同じ入力に対して、fgets を用いると
j
0
1
2
3
4
5
6
7
8
9
10
11
12
line[j]
’D’
’a’
’i’
’t’
’o’
’ ’
’U’
’n’
’i’
’v’
’.’
’\n’
’\0’
となる。
↘ 左から続く
#include <stdio.h>
#define SIZE 100
printf("\n\nEnter (scanf) : ");
scanf("%s", line);
int main()
{
char line[SIZE], c;
int i;
printf("(scanf)===%s===\n", line);
for (i = 0; (c = line[i]) != ’\0’; i++) {
if (c == ’\n’) { printf(" \\n, "); }
else { printf("%3c, ", c); }
}
printf("Enter (fgets) : ");
fgets(line, SIZE, stdin);
printf("(fgets)===%s===\n", line);
for (i = 0; (c = line[i]) != ’\0’; i++) {
if (c == ’\n’) { printf(" \\n, "); }
else { printf("%3c, ", c); }
}
printf("\n");
printf("\n");
printf("\n");
for (i = 0; (c = line[i]) != ’\0’; i++) {
printf("%3d, ", c);
for (i = 0; (c = line[i]) != ’\0’; i++) {
printf("%3d, ", c);
}
return 0;
}
}
↗ 右に続く
• char 型変数 c の値が ’\n’ のとき、printf("%3c, ", c); を実行すると printf("␣␣\n,␣"); を実行し
たのと同じなので、明示的に\n という文字列を出力させている。\ を出力するには「出力書式」に \\ と
書けば良い。
このプログラムの fgets と scanf の順序を変更して実験せよ。またなぜそのような出力結果になるかを考えよ。
26