[注意] 引用符「'」で囲んだ文字定数とは区別する必要がある
"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 がいくつ出現するかを数えるプログラムを作りなさい.