許せない心理テスト

strcatについて質問なのですが、下のソースのようにプログラムをかいたのですが、strcatの部分でエラーになってしまいます。
何が原因なのかわかりません。なにか気がつかれた方がおられましたら
お願いします。

----ソース------
char *s1="川";
char *s2="山";

strcat(s1,s2);
----------------

A 回答 (5件)

C言語の文字列は自動でサイズ変更してくれません。

VBなどの言語と比べると、とても不便です。配列の操作だと考えて下さい(実際文字の配列です)。確保されているメモリについて、プログラマ自身が意識して管理する必要があります。

例:予めサイズを決めておく

char s1[16]="川";
char *s2="山";

strcat(s1,s2);


例:動的にメモリを確保する

char *s1="川";
char *s2="山";
char *s3;

s3 = (char *)malloc(sizeof(char) * (strlen(s1)+strlen(s2)+1));
strcpy(s3,s1);
strcat(s3,s2);

補足
#2さんは strcpyと勘違いされてるかな?
    • good
    • 0

#2です。



> #2さんは strcpyと勘違いされてるかな?

失礼。ご指摘のとおりでした。
# 最近勘違いが多いです。ちょっと反省しています。
    • good
    • 0

const char* s1 = "川";



とすればコンパイルエラーになるかと思いきや、gcc-3.4.2 ではダメだった。
    • good
    • 0

少なくともコンパイルエラーやリンクエラーにはならないはずです。



ただし、文字列リテラルの領域に書き込んだ場合の動作は未定義ですので、実行時に何らかのエラーが発生する可能性はあります。
なお、共通の拡張として、文字列リテラルの領域に書き込める処理系もありますし、多くの文字コードでは"川"と"山"のバイト数も同じでしょうから、その場合にはエラーになりません。
    • good
    • 0

★メモリが足りません。


・エラーになって当然ですよ。
・『strcat』の第1引数は『山』を追加するスペースがないのです。
・第1引数『s1』に第2引数『s2』を追加します。
・メモリ領域が足りません。
・ビルド(コンパイル)時にはエラーにはなりませんが、実行時に必ずエラーになります。

●サンプル
char s1[10] = "川";
char *s2 = "山";

strcat( s1, s2 );

これならばエラーにはなりません。
以上。おわり。

参考URL:http://www.bohyoh.com/CandCPP/C/Library/strcat.h …
    • good
    • 0
この回答へのお礼

なるほど・・・。わかりやすい説明ありがとうございます!!
かなり単純な理由だったんですね。

お礼日時:2007/01/13 19:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報