プログラミング 4 文字列
C 言語での文字の表現 「1 文字」を表すのに char 型を使う 文字の定数は「'」(単一引用符)でくくって表す 実体は整数を表す型で,文字に振られた番号(文字コード) を保持する 定義は「char c;」のように行える 文字の定数は「'」(単一引用符)でくくって表す たとえば char 型の変数 c に「a」を代入:c = 'a'; 文字列(「"」でくくって表す)と間違えないように 当面,文字・文字列は半角文字を扱う 全角文字の扱いは複雑な点があるので
文字列の表現(1) C 言語では,文字列は「文字の配列(char の配 列)」で表現する char の配列 s[] に「Hello」という文字列を記憶させ る s[0] は ‘H’,s[1] は ‘e’,……,s[4] は ‘o’ s[5](最後の文字の次の要素)に ‘\0’ が入る 文字列の表現では,少なくとも「文字数+1」の要素数が必 要 ‘\0’ 以降の要素は使われない s[0] s[1] s[2] s[3] s[4] s[5] H e l o \0
文字列の表現(2) char の配列の初期化 初期化のとき以外,文字列の一括代入はできない 配列の初期化なので char s[] = { ‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’ }; char の配列に限り文字列定数で初期化できる char s[] = “Hello”; 初期化のとき以外,文字列の一括代入はできない char s[10]; s = “Hello”; ←できない
文字列の入出力 scanf() 関数 printf() 関数 変換文字列「%s」を使う 文字列を収めたい char の配列の名前を渡す char s[1024]; scanf(“%s”, s); ここで,確保した要素数より多い文字を入力してはいけない (バッファオーバランになる) printf() 関数 ‘\0’ までを出力する 出力したい文字列を収めた char の配列の名前を渡す printf(“%s\n”, s);
文字列の操作(1) 文字列の操作では,終端に ‘\0’ が入っていることを 使うものが多い 次のような形式が頻繁に現れる for (i = 0; s[i] != ‘\0’; i++) { … } while (s[i] != ‘\0’) { … }
文字列の操作(2):文字数 ‘\0’ が現れるまでに何個の要素があったかを数えれ ばよい int myStrlen(char s[]) { int i; for (i = 0; s[i] != ‘\0’; i++) ; return i; } 「’\0’ が入っていた要素番号」が文字数と一致する s[0] s[1] s[2] s[3] s[4] s[5] H e l o \0
文字列の操作(3):コピー 文字列どうしは = 演算子でコピーできない 文字列は配列:配列のコピー(’\0’ で終端) void myStrcpy(char dst[], char src[]) { int i; for (i = 0; src[i] != ‘\0’; i++) { dst[i] = src[i]; } dst[i] = ‘\0’; /* 最後の ‘\0’ をコピー */ return; } バッファオーバランに注意
文字列の操作(4):比較 文字列どうしは == で比較できない 「s == t」は「配列の先頭アドレスの比較」になる 1 文字ずつ,’\0’ に達するまで比較する int myStreql(char s[], char t[]) { int i; for (i = 0; s[i] == t[i]; i++) { if (s[i] == ‘\0’) return 1; } return 0; }
文字列の操作(5):整数に変換 数字の文字コードは ‘0’~’9’ でつながっている:文字 c が「数字の文字」であるとき,「c – ‘0’」で 0~9 の数値に変換できる char 型の実体は文字コードであることに注意;整数なので演 算もできる 正の整数として解釈できる文字列を整数に変換 int myAtoi(char s[]) { int x = 0, i; for (i = 0; s[i] != ‘\0’; i++) { x = x * 10 + (s[i] – ‘0’); } return x; }
文字列に関する関数(1) #include <string.h> で使える strlen(s):s[] の文字数をカウント strcpy(s, t):t[] から s[] に文字列をコピー strcmp(s, t):s[] と s[] を比較;一致すると 0 を返す strcat(s, t):s[] に t[] を連結 #include <stdlib.h> で使える atoi(s):s[] が整数とみなせるときに整数に変換