1

以下のプログラムの問題点は何ですか?

main( ) 
{ 
 char *str1 = "United" ; 
 char *str2 = "Front" ; 
 char *str3 ; 
 str3 = strcat ( str1, str2 ) ; 
 printf ( "\n%s", str3 ) ; 
} 

上記のプログラムをコンパイルできず、常に実行時エラーが発生します。2 つの文字列を連結しようとしています。上記のプログラムに誤りはありませんか?

ありがとう。

4

3 に答える 3

3

あなたのchar *str1 = "United"ようにします

char str1[<required memory for concatenated resultant string>] = "United".

である宛先バッファにメモリを割り当てる必要がありますstr1str3のアドレスもstr1結果に含まれます。'strcat' は、宛先バッファー (str1) の空き容量をチェックしません。プログラマーはそれを処理する必要があります。

于 2013-06-10T04:59:59.390 に答える
2

文字列リテラルを変更しようとしていますが、コンパイラ (およびランタイム サポート) では変更できません。これを行うと、'未定義の動作' が呼び出されます。これは悪いことです!™ 何が起こる可能性があります。プログラムがクラッシュするのは正当なことです。未定義の動作は避けてください。

おそらく次のように、文字列に十分な(書き込み可能な)メモリを割り当てる必要があります。

#include <stdio.h>
#include <string.h>

int main(void)
{
    char *str1 = "United";
    char *str2 = "Front";
    char  str3[64];
    strcpy(str3, str1);
    strcat(str3, str2);
    printf("%s\n", str3);
    return(0);
}
于 2013-06-10T04:42:24.213 に答える
0

を宣言するときはchar *str = "someText"、基本的に、変更できない文字列定数へのポインターを初期化し、コンピューターのメモリのどこかに配置します。

その後、関数を使用して、strcat()その文字列定数を変更しようとしていますが、これは定数であると述べました。このような動作はエラーなしでコンパイルされますが、const(定数) は実行時に機能し、のようにプリコンパイルされないため、実行時にプログラムがクラッシュします#define

あなたのための別の解決策は、

#include<stdio.h>
#include<string.h>

int main(void) {

    char* str1 = "Hello,";
    char* str2 = " World";
    char str3[30];

    strcpy(str3, str1);
    strcat(str3, str2);

    printf("%s\n", str3);
    printf("\n\n\n");
    return 0;
}

それが役立つことを願っています! 今後ともよろしくお願いします!

于 2013-06-10T13:24:16.027 に答える