• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字列を関数に渡すぷろぐらむなのですがおかしいです。)

文字列を関数に渡すプログラムがおかしいです

このQ&Aのポイント
  • 文字列を関数に渡すプログラムがうまく動作しない
  • toupper関数やputchar関数についての質問あり
  • プログラムが暴走しているが原因がわからない

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

  • ベストアンサー
  • hegemon
  • ベストアンサー率72% (21/29)
回答No.3

>toupperは、大文字にするんですよね。 そのとおりです。 >putcharは、基本的にchar型でしたっけ? 意味的にはcharなのですが、引数としてスタックに積む際、最小単位がintになってしまうので、int型で渡す定義になってます。 >putsとgetsは、int型でしたっけ? 最後の「s」は「string」の「s」なので、char*を渡します。 > char st[10]="abcde"; > ・・・ > str(st); まずここですが、char型の値10個分の配列が作られ、先頭の6つが"abcde"と'\9'で埋まってます。 これは書き換えが出来ますから、配列のサイズをはみ出なければ問題ありません。 しかし、次は大問題です。 > str("ABCabc123"); > ・・・ "ABCabc123"は「リテラル文字列」であり、通常は定数として扱われます。 定数は書き換えてはいけません。にもかかわらず、書き換えてしまってます。 >void str(char a[]) >{ > ・・・ >   a[i]=toupper(a[i]); 処理系によっては、メモリアクセスエラーとなって、異常終了するでしょう。

tomo_ko_n
質問者

お礼

確かにその通りだと思います。 ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

念のためにお聞きしますが、デバッガでステップ実行されましたか? ポインタ(文字列)を理解するためにステップ実行したほうが良いとコメントしたはずですが。 デバッガがちゃんと使えていたら、どこで問題が出たか把握できるはずです。 >後、プログラムが暴走してます。 暴走じゃなくて異常終了では? 定数"ABCabc123"をtoupperしているのが原因です。 定数を書き換えることはOSが保護しているので出来ません。 書き換えられたら定数の意味がないので、プログラムがおかしいのであってOSとコンパイラは正しいです。

すると、全ての回答が全文表示されます。
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

質問の内容がよくわかりませんが、 関数の使い方がわからないけど、調べるつもりは無いので、教えてくださいって事かな? 関数の使い方については、リファレンスを参照して下さい。 その上で、疑問点を質問するとよいです。 > 後、プログラムが暴走してます。 > どこがおかしいんでしょう? ですが、これはわかりにくいかもしれないので、少しヒントを > str("ABCabc123"); の部分で、文字列定数を、str()関数に渡していますが、 文字列定数は、読み取り専用領域に配備される事があります。 ので、 > a[i]=toupper(a[i]); の部分で、読み取り専用領域に書き込みしようとして、 セグメンテーションエラーか、アプリケーションエラーに なっているのではないかと疑われます。

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • インターホンVL-MZ30の音が2階で聞こえない場合の対策を考えています。
  • 子機やスピーカーの増設を検討していますが、対応機種が分からず困っています。
  • 他の解決策があれば教えてください。
回答を見る

専門家に質問してみよう