まず、一般的な文字コードでは全角カタカナは2バイト以上で表されるので、重なった領域間でのstrcpyをすることになり、
未定義動作になります。
次に、titleやsubtitleにはbuf[1]を指すポインタが格納されています。(未定義動作なので何が起こってもおかしくないですが、strcpyの通常の動作およびENDが出力されていることからこう予想できます)
bufの中身はfgetsによって上書きされるので、strcpyの戻り値を代入した時の文字列をそのまま保持することはできません。
最後に、fopenしたのにfcloseしていないこと、そしてtitleやsubtitleがtest.txtの中身によっては不定のままprintfに渡されてしまうのもよくないように思えます。
ロコン さんが書きました:何がいけなかったのでしょうか?
「以下のようなコードを実行してstrcpyの結果をprintfで表示させたい」「strcpy関数の戻り値を変数に保存したい」と考えたのがいけなかったのでしょう。
想定の結果を得るには、「strcpy関数の戻り値を変数に保存する」のではなく、「mallocなどで確保した領域へのポインタを変数に保存し、そこにstrcpyする」のがいいでしょう。
文字列を格納する領域は、少なくとも文字列の長さ(strlenで得られる)+1(最後のナル文字の分)バイト必要です。
まず、一般的な文字コードでは全角カタカナは2バイト以上で表されるので、重なった領域間でのstrcpyをすることになり、[glow=red]未定義動作[/glow]になります。
次に、titleやsubtitleにはbuf[1]を指すポインタが格納されています。(未定義動作なので何が起こってもおかしくないですが、strcpyの通常の動作およびENDが出力されていることからこう予想できます)
bufの中身はfgetsによって上書きされるので、strcpyの戻り値を代入した時の文字列をそのまま保持することはできません。
最後に、fopenしたのにfcloseしていないこと、そしてtitleやsubtitleがtest.txtの中身によっては不定のままprintfに渡されてしまうのもよくないように思えます。
[quote="ロコン" id=3,19585,147914]何がいけなかったのでしょうか?[/quote]
「以下のようなコードを実行してstrcpyの結果をprintfで表示させたい」「strcpy関数の戻り値を変数に保存したい」と考えたのがいけなかったのでしょう。
想定の結果を得るには、「strcpy関数の戻り値を変数に保存する」のではなく、「mallocなどで確保した領域へのポインタを変数に保存し、そこにstrcpyする」のがいいでしょう。
文字列を格納する領域は、少なくとも文字列の長さ(strlenで得られる)+1(最後のナル文字の分)バイト必要です。