ページ 11

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

Posted: 2012年11月21日(水) 19:23
by ars
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;
}

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

Posted: 2012年11月21日(水) 21:59
by softya(ソフト屋)
非常に見づらいトリッキーなコードのなので検証してませんが、tの文字の終端コードを超えて処理をしているのではないでしょうか?
つまり、tの文字列配列以上の部分を書き換えています。
※ 普通は異常終了するですが、たまたま動いているようです。

あっ
t[l1+r1] = (s[l1+l2]>s[n-1-(r1+r2)]) ? s[n-1-(r1++)] : s[(l1++)];
の場合左辺と右辺で同じr1やl1が出てきますが右辺でインクリメントしてますね。
この場合の動作は未定義です。
この状況でl1+r1がインクリメント前後のどちらの値を使うかはコンパイラとCPUなど環境依存になってしまうため書いてはいけないことになっています。