• ベストアンサー

出力制限

c言語初心者です。 fgets(a,71,stdin); を使います。 このaを三回連結させます。 そして printf("%s",a); で三回連結させたのを210文字で出力したいのです。 しかしどのようにして250まで出力させる制限をつけるのかがわかりません。 どなたかおしえてください。私のやり方方だと70文字以上入力するとエラーしてしまいます。

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

  • ベストアンサー
  • YUI_AI
  • ベストアンサー率45% (303/661)
回答No.3

strcat(a,dh); ↑[a] に [dh] を結合で良いですか? printf("%s",ch); さらに、宣言されていない[ch]を出力していますが。 [dh]の誤植でも最初の strcpy(dh,a); 以降は[dh]に変更は加えられていないので後の strcat()は無意味と思います。 void main() { char a[211]; char dh[211]; fgets(a,71,stdin); dh[strlen(a) - 1] = '\0'; strcpy(dh,a); strcat(dh,a); strcat(ah,a); printf("%s",dh); return; こんな感じですか? ※推測を交えています。

armpoint
質問者

補足

ありがとうございます。 私自身かなり整理できていない部分がありましたので、大変参考になります。

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

その他の回答 (4)

回答No.5

http://okwave.jp/qa5506830.html で新しい質問立ててるみたいだけど、 >いちおうプログラムは動くのですが70以上入力するとだめみたいです。 の「だめ『みたい』」ではさっぱり伝わらないんだけど。 「みたい」ってことは、本当は正しい動作するのに理解してないってこと? まぁ、「バッファオーバーフロー」の対策とかがないためだとは推測してるけど。

armpoint
質問者

補足

原因が何かわかってなかったので違う角度から検討するため質問をたてました。 言葉使いがあいまいになり申し訳ないです。 きちんとした質問ができるよう心がけたいと思います。 ご指摘ありがとうございます。 ちなみに問題はバッファクリアができていなかったからです。 バッファが何かも知らない初心者なので言葉もあいまいになりがちです。

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

210文字表示させたいんですよね・・・。 なら ch[strlen(a) - 1] = '\0'; はだめですね。 例えばこう・・。 char a[70+1],dh[70*3+1]; fgets(a,70+1,stdin); if (a[strlen(a) - 1] == '\n') { a[strlen(a) - 1] = '\0'; } strcpy(dh,a); strcat(dh,a); strcat(dh,a); printf("%s",dh);

armpoint
質問者

補足

いちおうプログラムは動くのですが70以上入力するとだめみたいです。 70以上入力させてもそこから70を読み取って三回連結させて、210表示させたいのですが、、、、、そういった方法はありませんか?

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

とりあえず、「3回」とかその前に >それ以上の入力だとエラーがおきてしまいます。 のエラーメッセージの内容は? ここに解決への重要なヒントがででいることが多いよ。 「segmnet~」か「runtime~」が出てるんじゃないかな? まず、ソースを見て簡単にわかること。 >char a[71]; >char dh[71]; この時点でNG。 stcpy()なら、コピー元とコピー先が同じサイズならひとまずはOKだけど、 strcat()は保存先に「結合後のサイズ」がないと問題が発生する。 「210文字」なら、「211文字(NULL終端含む)は必要。 >このままでは三回連結させたものが70文字ならできるのですが、それ以上の入力だとエラーがおきてしまいます。 って、自分で問題の原因書いてるし。

armpoint
質問者

お礼

ありがとうございます。 おかげさまでなんとか理解できました。

armpoint
質問者

補足

70桁以上だとそれを無視し、その70桁を三回つないで表示させたいのですがエラーさせない方法がしりたいのです。 よろしくお願いします。

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

今やってることと、言いたいことがよくわからんから、ソース貼って。

armpoint
質問者

補足

わかりづらくて申し訳ないです。 今のソースはこんな感じです。 void main() { char a[71]; char dh[71]; fgets(a,71,stdin); ch[strlen(a) - 1] = '\0'; strcpy(dh,a); strcat(a,dh); strcat(a,dh); printf("%s",ch); return; このままでは三回連結させたものが70文字ならできるのですが、それ以上の入力だとエラーがおきてしまいます。なので入力した70文字を、70文字以上入力したときでもはじめの70文字を読み取りその後三回連結させたいのですが、、、その方法がわかりません。

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

関連するQ&A