• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語ののポインタについて)

C言語のポインタについて

このQ&Aのポイント
  • C言語のポインタについての質問です。
  • 質問は、「明解C言語 入門編」p262の演習11-4についてです。
  • 質問者は、vimで入力された文字の大文字小文字を反転するプログラムを書いていますが、警告が表示されています。どこを訂正すれば良いか教えてください。

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

  • ベストアンサー
  • trytobe
  • ベストアンサー率36% (3457/9591)
回答No.2

エラーではなく、警告(warning) なので、「本当に意図した書き方なの?大丈夫?」と言いながら、実行ファイルはできているはずですよ。 while(*str = toupper(*str)){ は、「while() の中は条件文にするのが普通で、それなら等値である意味の == で書かないと条件文にならないけど、本当に、toupper() 関数が str ポインターに代入した値そのものを真偽値として条件判断に使っていいの?」という警告内容。 *str++; は、「*str++; って増加させた後、str を使っているところが見当たらないんだけど、本当にいるの?」という警告内容。これは、前の警告の while() の中で使っているのでいいんだけど、それがコンパイラでは気付けないほど凝った技を使っているから。

mist55
質問者

お礼

試してみたらおっしゃるとおりちゃんと実行できました。 ありがとうございました。

その他の回答 (3)

回答No.4

失礼します。朝から気になってずっと考えていました。 実は私も同じ教材で学び、回答がありましたので記載します。 (※原因は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です。以上です。

mist55
質問者

お礼

同じところ勉強中なのですね ありがとうございます助かりました。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

警告の内容としてはポインタは全然関係ないです。 >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++; と*演算子を取り除くことで対処できます。 警告はエラーではないからと気にしなくていいものではありません。 自分で警告が出ることを把握しているならいいですが(意図して行ってるって事ですから)、意図しない動作になるコードになってる事も多いですので問題ないかの確認はした方がよいです。

mist55
質問者

お礼

警告とエラーが異なることを今初めて知りました。 ありがとうございました。

  • f272
  • ベストアンサー率46% (8529/18257)
回答No.1

warningであってerrorではないから気にするなと,一応は言っておく。答えは出るはずです。 ただ *str++; これは意味がないですね。 str++; だろう。

mist55
質問者

お礼

warningとerrorは別物なのですね 実際やってみたらちゃんと実行されました。 ありがとうございました。

mist55
質問者

補足

warningとerrorは別物なのですね 実際やってみたらちゃんと実行されました。 ありがとうございました。

関連するQ&A

専門家に質問してみよう