• ベストアンサー

文字列から文字を探す

以下のプログラムです。 #include <stdio.h> main () { char s[]="I love cat and dog."; char c='a'; char *p=s; int n=0; printf("\"%s\"の中から\'%c\'を探します。",s,c); while(*p != '\0') { if(*p == 0) { printf("%d文字目で発見しました。\n",p-s+1); n++; } p++; } if(n == 0) printf("1つも見つかりませんでした。\n"); else printf("全部で%d個見つかりました。\n",n); } C言語の本で勉強しています。 ・p-s+1の意味がわかりません。 ここには何が割り当てられているのでしょうか? ・*pとpの違いもあいまいです。 ・\"%s\"は「"」を印刷するためには必要なのでしょうか? どう質問していいのかもわからないのですが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tomorot
  • ベストアンサー率47% (16/34)
回答No.2

まず、バグがありますね。 10行目 if(*p == 0) { ではなく、 if(*p == c) { にしないと、文字の比較がちゃんとできません。 具体的にs[]のアドレスを1000番から始まると仮定すると、 番地 メモリ内容 1000 'I' 1001 ' ' 1002 'l' 1003 'o' 1004 'v' 1005 'e' という風になります。 char *p=s; で、ポインタ変数p には1000が代入されます。 上記では'a'ですが、たとえば、'o'を探すとすると、 p==1003で、*p(p番地の内容、つまり、'o')が、c('o')と一致します。 で、p-s+1 = 1003-1000+1 = 4 で、4文字目となります。 +1は、No.1の方が答えられている通り、先頭を0文字目でなく、1文字目とするためです。 \" は、文字列内で"を表示するためのエスケープシーケンスです。 \' で、'を表示、\n で改行を表します。 ポインタの勉強は難しいかもしれませんが、メモリの中身がどうなっているかを考えましょう。

noname#98697
質問者

お礼

ありがとうございました。 丁寧に説明して頂いたので、理解できました。 また質問するかもしれませんが、よろしくお願いします。 すいません、バグはタイピングミスです。

その他の回答 (1)

  • clsdi99
  • ベストアンサー率63% (31/49)
回答No.1

p-s+1について これはポインタ(アドレス)の演算を行っています。 このソースコードでは、一文字見る毎に変数pが指す アドレスが増えていきます。 一方変数sが指すポインタは"I love cat and dog."の先頭アドレス(つまり'I'の位置)です。 文字列は連続したメモリ配置ですのでpからsを引き算するとsからの相対位置がわかるのです。で表示上0文字目というのはおかしいので+1して1文字目から表示されるようにしているのです。 ・*pとpについて ポインタを勉強しないと難しいですね。

noname#98697
質問者

お礼

ありがとうございました。 ポインタを勉強している最中なんですが、なかなか理解するのが難しいです。

関連するQ&A