Cの絵本(ポインタ部分)からの質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
papaまる
記事: 3
登録日時: 7年前

Cの絵本(ポインタ部分)からの質問です

#1

投稿記事 by papaまる » 7年前

先輩方、お暇な時に教えて頂ければと思います。
文字列の中から文字を探すプログラムです。(Cの絵本サンプルプログラムより抜粋)
???以下の解釈で合ってますでしょうか???
1、char cのcはaという文字が代入される
2、char *p = sのpには、I love cat and dog.の頭文字「I」のアドレスが代入される。
3、ただ、sを%sで受けると、「I love cat and dog.」全体を指す
4、while(*p != '\0')は、「pの値がnullではない」ならば繰り返す、ということ
5、 if(*p == c)は、「pの値がcと同じならば」つまり「pの値がaという文字ならば」ということ

【不明点】
6、p-s+1って何を意味しているのでしょうか
7、nの役割って何なのでしょうか?n++って。いったい何を増やしているのでしょうか?

コード:

#include <stdio.h>
main()
{
     char s[] = "I love cat and dog.";
     char c = 'a';
     char *p = s;
     int n = 0;

     printf("\"%s\"の中から\'%c\'を探します。\n",s,c);
     while(*p != '\0'){
           if(*p == c){
             printf("%d文字目で発見しました。\n",p-s+1);
             n++;
           }
           p++;
     }
     if(n == 0){
        printf("1つも見つかりませんでした。\n");
     }else{
        printf("全部で%d個見つかりました。\n",n);
     {
} 
結果
"I love cat and dog."の中から'a'を探します。
9文字目で発見しました。
12文字目で発見しました。
全部で2個見つかりました。

lunnear
記事: 10
登録日時: 7年前

Re: Cの絵本(ポインタ部分)からの質問です

#2

投稿記事 by lunnear » 7年前

1-5については大体合っていると思います。
正確には、3はpのアドレスから'/0'まで、5はpの実体がcと同じなら、です。

6について、charの配列に文字列を入れるとメモリ上には文字が順番に保存されます。
なので文字列の先頭アドレス-現在走査している文字のアドレス+1をすることで走査している文字が何文字目かがわかります。

7について、変数名がよろしくないようで、変数名をfind等にするとわかりやすいと思います。
つまり見つけた数を保存するカウンタです。

lunnear
記事: 10
登録日時: 7年前

Re: Cの絵本(ポインタ部分)からの質問です

#3

投稿記事 by lunnear » 7年前

先頭アドレス-現在走査している文字のアドレス+1
はミスで
現在走査している文字のアドレス-先頭アドレス+1
ですすいません。

papaまる(お礼)

Re: Cの絵本(ポインタ部分)からの質問です

#4

投稿記事 by papaまる(お礼) » 7年前

lunnear様
よくわかりました。

例えば初期アドレスがaで以降a+1,a+2,a+3,a+4だった場合、
a+4 - a +1を計算すれば5番目ということになりますもんね。

それとnはifの中を通った回数だから、見つけた回数ということなんですね。
確かにnはわかりずらいです。

ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る