合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: papaまる
[URL]
ぴよぴよ(785 ポイント)
Date: 2017年10月04日(水) 14:35
No: 1
(OFFLINE)

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

先輩方、お暇な時に教えて頂ければと思います。
文字列の中から文字を探すプログラムです。(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++って。いったい何を増やしているのでしょうか?

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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個見つかりました。

Name: lunnear
[URL]
ぴよぴよ(232 ポイント)
Date: 2017年10月04日(水) 16:15
No: 2
(OFFLINE)

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

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

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

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

Name: lunnear
[URL]
ぴよぴよ(232 ポイント)
Date: 2017年10月04日(水) 16:18
No: 3
(OFFLINE)

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

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

Name: papaまる(お礼)
[URL]
Date: 2017年10月04日(水) 17:32
No: 4
(OFFLINE)

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

[解決!]

lunnear様
よくわかりました。

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

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

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[18人]