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
© Copyright 2025 ExpyDoc