これが私のコードです:
char *name, name_log="log-";
------ユーザーから「名前」を取得-----
strcat(name_log, name);
char ext[] = ".log";
strcat(name_log, ext);
最終的にはname_log="log-'name'.log"になりますが、セグメンテーション違反エラーが発生します:((。何が間違っているので、どうすれば修正できますか?Thx
これが私のコードです:
char *name, name_log="log-";
------ユーザーから「名前」を取得-----
strcat(name_log, name);
char ext[] = ".log";
strcat(name_log, ext);
最終的にはname_log="log-'name'.log"になりますが、セグメンテーション違反エラーが発生します:((。何が間違っているので、どうすれば修正できますか?Thx
文字列リテラルには、通常は読み取り専用セクションで一定量のメモリが割り当てられます。代わりに、バッファを使用する必要があります。
char buffer[64] = "log-";
strncat(buffer,".log",32);
ちなみに、strcat
一般的に安全ではありません。使用するバッファのサイズをチェックするもの、または連結できるものに制限があるものを使用する必要がありますstrncat
。
まず、これがあなたのコードである場合:
char *name, name_log="log-";
次にname_log
、charポインタではなくcharです。
それがタイプミスだとすると、そのような文字列リテラルに追加することはできません。文字列リテラルへの変更は未定義の動作です。
可変サイズの文字列のuser
場合、おそらく最も安全なオプションは、結果を保持するのに十分な大きさの別の文字列を割り当てることです。たとえば、次のようになります。
char *name, *name_log = "log-", *ext = ".log";
// Do something to allocate and populate name
char *buffer = malloc (strlen (name_log) + strlen (name) + strlen (ext) + 1);
if (buffer == NULL) {
// Out of memory.
} else {
strcpy (buffer, name_log);
strcat (buffer, name);
strcat (buffer, ext);
// Do something with buffer.
free (buffer);
}
はmalloc
、すべての文字列操作を安全に実行するのに十分なスペース、3つのコンポーネントに十分な文字、およびヌルターミネータを確保します。
完全に異なる解決策はこれです:
const char *prefix = "log-";
const char *suffix = ".log";
// There's a "char *name" somewhere
int size_needed;
char *result;
size_needed = snprintf(NULL, 0, "%s%s%s", prefix, name, suffix);
result = malloc(size_needed + 1);
snprintf(result, size_needed + 1, "%s%s%s", prefix, name, suffix);
// "result" now contains the desired string.
良い点snprintf
は、十分なスペースがある場合に書き込む文字数を返すことです。これは、割り当てるメモリの量を事前に測定することで使用できます。これにより、複雑でエラーが発生しやすい計算が不要になります。
が付いているシステムを使用している場合はasprintf
、さらに簡単です。
char *result = NULL /* in case asprintf fails */;
asprintf(&result, "log-%s.log", name);
// "result" must be released with "free"
メモリを割り当てる必要があります。追加された文字列は割り当てられていないメモリに送られるため、この方法で文字列に追加することはできません。
できるよ
char[20] strarray;
strcat(strarray, "log-");
strcat(strarray, "abcd");
name_logは静的な場所を指します: "log-"は、を変更できなかったことを意味しますが、の最初のパラメーターとして、strcat()
変更可能である必要があります。
name_logのタイプchar*
を次のように変更してみてくださいchar[]
。
char[20] name_log = "log-";