以下のプログラムの問題点は何ですか?
main( )
{
char *str1 = "United" ;
char *str2 = "Front" ;
char *str3 ;
str3 = strcat ( str1, str2 ) ;
printf ( "\n%s", str3 ) ;
}
上記のプログラムをコンパイルできず、常に実行時エラーが発生します。2 つの文字列を連結しようとしています。上記のプログラムに誤りはありませんか?
ありがとう。
以下のプログラムの問題点は何ですか?
main( )
{
char *str1 = "United" ;
char *str2 = "Front" ;
char *str3 ;
str3 = strcat ( str1, str2 ) ;
printf ( "\n%s", str3 ) ;
}
上記のプログラムをコンパイルできず、常に実行時エラーが発生します。2 つの文字列を連結しようとしています。上記のプログラムに誤りはありませんか?
ありがとう。
あなたのchar *str1 = "United"
ようにします
char str1[<required memory for concatenated resultant string>] = "United"
.
である宛先バッファにメモリを割り当てる必要がありますstr1
。str3
のアドレスもstr1
結果に含まれます。'strcat' は、宛先バッファー (str1) の空き容量をチェックしません。プログラマーはそれを処理する必要があります。
文字列リテラルを変更しようとしていますが、コンパイラ (およびランタイム サポート) では変更できません。これを行うと、'未定義の動作' が呼び出されます。これは悪いことです!™ 何が起こる可能性があります。プログラムがクラッシュするのは正当なことです。未定義の動作は避けてください。
おそらく次のように、文字列に十分な(書き込み可能な)メモリを割り当てる必要があります。
#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);
}
を宣言するときは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;
}
それが役立つことを願っています! 今後ともよろしくお願いします!