- ベストアンサー
C言語のポインタについて
- C言語のポインタについての質問です。
- 質問は、「明解C言語 入門編」p262の演習11-4についてです。
- 質問者は、vimで入力された文字の大文字小文字を反転するプログラムを書いていますが、警告が表示されています。どこを訂正すれば良いか教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
エラーではなく、警告(warning) なので、「本当に意図した書き方なの?大丈夫?」と言いながら、実行ファイルはできているはずですよ。 while(*str = toupper(*str)){ は、「while() の中は条件文にするのが普通で、それなら等値である意味の == で書かないと条件文にならないけど、本当に、toupper() 関数が str ポインターに代入した値そのものを真偽値として条件判断に使っていいの?」という警告内容。 *str++; は、「*str++; って増加させた後、str を使っているところが見当たらないんだけど、本当にいるの?」という警告内容。これは、前の警告の while() の中で使っているのでいいんだけど、それがコンパイラでは気付けないほど凝った技を使っているから。
その他の回答 (3)
- -q7P2izb__
- ベストアンサー率47% (27/57)
失礼します。朝から気になってずっと考えていました。 実は私も同じ教材で学び、回答がありましたので記載します。 (※原因はwhileの条件文の箇所が複雑だからかと思いま) #include <ctype.h> #include <stdio.h> /*--- 文字列内の英字を大文字に変換 ---*/ void str_toupper(char *str) { while (*str) *str++ = toupper(*str); } /*--- 文字列内の英字を小文字に変換 ---*/ void str_tolower(char *str) { while (*str) *str++ = tolower(*str); } int main(void) { char str[100]; printf("文字列を入力して下さい:"); scanf("%s", str); str_toupper(str); printf("大文字:%s\n", str); str_tolower(str); printf("小文字:%s\n", str); return (0); } ---- 実行結果はエラー、警告ともになしで動きました。 環境はVisualStudio2008です。以上です。
お礼
同じところ勉強中なのですね ありがとうございます助かりました。
- wormhole
- ベストアンサー率28% (1626/5665)
警告の内容としてはポインタは全然関係ないです。 >ex11-4.c:6:13: note: use '==' to turn this assignment into an equality comparison >while(*str = toupper(*str)){ これ自身は while ((*str = toupper(*str)) != 0) { の略なので問題はないのですが while (A == B) { と==で書く所をタイプミスや勘違いなどで while (A = B) { と==が=になってると意味が異なりますから、その事への警告です。 内容的には「等しいか比較するつもりなら'='ではなく'=='を使ってください」といったところです。 対処方法としては先に書いた while ((*str = toupper(*str)) != 0) { と書いたり while ((*str = toupper(*str))) { と書く事で、その警告は消せます。 >ex11-4.c:7:3: warning: expression result unused [-Wunused-value] >*str++; str++;と書く所を頭に*演算子を付けてしまっているだけですけど、 その事によりstrのポインタが指す先の値を参照する演算が行われることになります。 ですが参照による演算結果の値は何にも使われていないので、その事への警告です。 今回の場合は*演算子を頭につけたことによっておきた事ですから str++; と*演算子を取り除くことで対処できます。 警告はエラーではないからと気にしなくていいものではありません。 自分で警告が出ることを把握しているならいいですが(意図して行ってるって事ですから)、意図しない動作になるコードになってる事も多いですので問題ないかの確認はした方がよいです。
お礼
警告とエラーが異なることを今初めて知りました。 ありがとうございました。
- f272
- ベストアンサー率46% (8529/18257)
warningであってerrorではないから気にするなと,一応は言っておく。答えは出るはずです。 ただ *str++; これは意味がないですね。 str++; だろう。
お礼
warningとerrorは別物なのですね 実際やってみたらちゃんと実行されました。 ありがとうございました。
補足
warningとerrorは別物なのですね 実際やってみたらちゃんと実行されました。 ありがとうございました。
お礼
試してみたらおっしゃるとおりちゃんと実行できました。 ありがとうございました。