- ベストアンサー
strrchrについて【C言語】
このプログラムのp-strの部分は具体的にはどの様な計算をしているのでしょうか?? (xx-xxというふうに) あとint c は char c としなくても良いのでしょうか?? どなたかご教授よろしくお願いいたします<(_ _)> #include <string.h> #include <stdio.h> int main(void) { char str[]= "abcdefghijklmnabcdefghijklmn", *p; int c; printf("検索文字を入力してください。"); c = getchar(); p = strrchr(str, c); if (p != NULL) { printf("%cは文字列の%d番目にあります。\n", c, p-str); printf("以降の文字列は%sです。\n", p); } else printf("%cは見つかりませんでした\n", c); return 0; } 【実行結果例】 検索文字を入力してください。d dは文字列の17番目にあります。 以降の文字列はdefghijklmnです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>このプログラムのp-strの部分は具体的にはどの様な計算をしているのでしょうか?? ポインタ同士の減算を行うと、オブジェクト単位での、2つのポインタの差を求めます。 以下の例を見て下さい。 int i; char *p1,*p2,str[20]; p1=&str[15]; p2=&str[12]; i = p1-p2; /* iは15-12で3 */ i = &str[15] - &str[12]; /* iは15-12で3 */ i = p1 - &str[12]; /* iは15-12で3 */ i = p1 - &str[0]; /* iは15-0で15 */ i = p1 - str; /* strは&str[0]と同じ意味。iは15-0で15 */ この例の「i = p1 - &str[0];」と「i = p1 - str;」に注目して下さい。質問の「p-str」が何を意味するか判ります。 >あとint c は char c としなくても良いのでしょうか?? getchar関数はintを返します。もしエラーが起きてEOFが返されると、EOFはcharに収まらない値なので、EOFを判定出来なくなります。 また、strrchr関数の2番目の引数もintです。char cとしてしまうと、strrchrに渡す時にintに符号拡張され、おかしな事になる場合があります。
その他の回答 (1)
- tsukasa-12r
- ベストアンサー率65% (358/549)
str は "abcdefghijklmnabcdefghijklmn" の先頭のアドレスです。つまり、a の位置を指します。具体的には、 例えば 0x004113b8 のような数字になります。 strrchr() は、文字列の後ろから検索するので、 p = strrchr(str,'d'); は "abcdefghijklmnabcd" の末尾の 'd' のアドレスを指します。これは具体的には 0x004113c9 のような数字になります。 p - str は引き算の結果 17 になります。 getchar() の戻り値は int だから、int で良いと思います。
お礼
早速のお返事有難うございました!! とても参考になりました!! >>getchar() の戻り値は int charなのでてっきりint型だと勘違いしていました^^; >>strrchr() は、文字列の後ろから検索 前から計算するものだと思って計算をしていたのでもう一度計算しなおしてみたいと思います^^
お礼
早速のお返事有難うございます^^ 計算について今から参考にして計算しなおしてみたいと思います!! ご教授有難うございました!!