coutでchar配列を表示すると余分な文字列が表示される

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ars

coutでchar配列を表示すると余分な文字列が表示される

#1

投稿記事 by ars » 13年前

http://d.hatena.ne.jp/kanetai/20110506/1304707564
この問題を解いるのですが,タイトルのようなことが起こります.
例えば char s[]="aiueodfsguia" の場合は
answer: aiueodfsguia, aaaiiueodfsguフフフフフフフフフフフフaiueodfsguia
と出力されてしまいます.何故でしょうか?

コード:

 #include <iostream>

int main(void){
	int n=12;
	char s[]="aiueodfsguia";
	char t[]="            ";

	int l1=0, r1=0;
	while(l1+r1<n){
		int l2=0,r2=0;
		for(; s[l1+l2]==s[n-1-(r1+r2)]; l2++,r2++){}
		
		t[l1+r1] = (s[l1+l2]>s[n-1-(r1+r2)]) ? s[n-1-(r1++)] : s[(l1++)];
	}
	
	std::cout << "answer: " << s << ", " << t << "." << std::endl;
	std::cin >>s;

	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: coutでchar配列を表示すると余分な文字列が表示される

#2

投稿記事 by softya(ソフト屋) » 13年前

非常に見づらいトリッキーなコードのなので検証してませんが、tの文字の終端コードを超えて処理をしているのではないでしょうか?
つまり、tの文字列配列以上の部分を書き換えています。
※ 普通は異常終了するですが、たまたま動いているようです。

あっ
t[l1+r1] = (s[l1+l2]>s[n-1-(r1+r2)]) ? s[n-1-(r1++)] : s[(l1++)];
の場合左辺と右辺で同じr1やl1が出てきますが右辺でインクリメントしてますね。
この場合の動作は未定義です。
この状況でl1+r1がインクリメント前後のどちらの値を使うかはコンパイラとCPUなど環境依存になってしまうため書いてはいけないことになっています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る