[注意] 引用符「'」で囲んだ文字定数とは区別する必要がある
"abcd" = {'a', 'b', 'c', 'd', '\0'}
[例] 文字列の長さを求める.
int main(void) { char *c = "mojiretu no rei"; char *p; printf("文字列: %s\n", c); printf("文字列を個々に出力: "); p = c; // ポインタpを文字列cの先頭に設定 while(*p != '\0') { // pの指し示す値(文字)[*p]が終端記号に達するまで以下を繰り返す putchar(*p); p++; // pを次の文字に進める } putchar('\n'); printf("文字列の長さは,%dでした\n", p-c); // 終端記号の位置(アドレス)と先頭位置の差が文字の長さ }
次のプログラムも同じ動作をする
int main(void) { int n; char *c = "mojiretu no rei"; printf("文字列: %s\n", c); printf("文字列を個々に出力: "); n = 0; while(*(c+n) != '\0') { putchar(*(c+n)); n++; } putchar('\n'); printf("文字列の長さは,%dでした\n", n); }
文字列: mojiretu no rei 文字列を個々に出力: mojiretu no rei 文字列の長さは,15でした
上の図では,cが文字列の先頭を指し示し,pは3文字目を指し示している.
変数pには指し示す先のアドレスが記憶されており, *p で指し示す先に記憶されている値を参照することができる.
pの値と c+2 は等しく,*p の値は 'j' (文字 j のアスキーコード値)である.
int n; char *a, *p; // 文字データへのポインタを宣言 char b, c; c = 'x'; b = c; p = &c; // ポインタpに変数cのアドレスを格納する c = 'y'; if(c == b) printf("c[%c]とb[%c]は等しい\n", c, b); else printf("c[%c]とb[%c]は等しくない\n", c, b); if(c == *p) printf("c[%c]と*p[%c]は等しい\n", c, *p); else printf("c[%c]と*p[%c]は等しくない\n", c, *p); a = "xyz"; // 文字列"xyz"をメモリ内に記憶し, // その先頭アドレスをポインタ変数 a に記憶させる for(n=0; n<4; n++) printf("%d: %c[%0.2x]\n", n, *(a+n), *(a+n));
c[y]とb[x]は等しくない c[y]と*p[y]は等しい 0: x[78] 1: y[79] 2: z[7a] 3: [00]ポインタを用いて配列を参照することができる. 次の例は文字配列を使用して文字列を操作している.
#include <stdio.h> #include <string.h> int main(void) { char *p; // ポインタ char a[256]; // 256個の要素を持つ配列 scanf("%s", a); // 標準入力から文字列を読み込む p = a+strlen(a); // ポインタ p へ文字列の終端の次のアドレスを代入 while(p != a) { p--; // 前方へ戻りながら, putchar(*p); // pが指し示すアドレスに格納されている文字を書き出す } putchar('\n'); }
文字列stの長さを返す関数
#include <stdio.h> int main(int argc, char *argv[]) { int n; for(n=0; n<argc; n++) { printf("%d: %s\n", n, argv[n]); } }
コマンド a.out abc 012 4x 実行結果 0: a.out 1: abc 2: 012 3: 4x
標準入力および,標準出力であるキーボードからの入力,および, 画面への出力をファイルに切替えることができる.
./a.out < inputfile ./a.out > outputfile ./a.out < inputfile > outputfile
パイプ「|」でコマンドをつなぐことで, コマンドからの出力(標準出力)を次のコマンドの入力(標準入力)とすることができる
ls | wc ./a.out | tee outputfile
以下の設問において,1行分の文字列は100文字を越えないものとする.
[入出力の例]
入力データ This is a sentence 出力データ This is a sentence
[入出力の例]
入力データ I'm fine, and you? 出力データ I'm fine , and you ?
man lsと入力すると標準出力に ls コマンドの説明が表示(出力)される.
パイプを利用して,この出力である文字データを受け取り, その中に小文字の a がいくつ出現するかを数えるプログラムを作りなさい.