这是我的代码:
char *name, name_log="log-";
------从用户那里得到'名字'-----
strcat(name_log, name);
char ext[] = ".log";
strcat(name_log, ext);
我最终需要的是 name_log = "log-'name'.log" 但我收到分段错误错误:((。我做错了什么,我该如何解决?谢谢
这是我的代码:
char *name, name_log="log-";
------从用户那里得到'名字'-----
strcat(name_log, name);
char ext[] = ".log";
strcat(name_log, ext);
我最终需要的是 name_log = "log-'name'.log" 但我收到分段错误错误:((。我做错了什么,我该如何解决?谢谢
首先,如果这是您的代码:
char *name, name_log="log-";
thenname_log
是一个字符,而不是字符指针。
假设这是一个错字,你不能像这样附加到字符串文字。对字符串文字的修改是未定义的行为。
对于可变大小的字符串,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
空间安全地执行所有字符串操作,三个组件的足够字符加上一个空终止符。
字符串文字被分配了固定数量的内存,通常在只读部分中,您需要使用缓冲区。
char buffer[64] = "log-";
strncat(buffer,".log",32);
附带说明一下,strcat
通常是不安全的,您需要使用一些东西来检查它使用的缓冲区的大小或限制它可以连接的内容,例如strncat
.
一个完全不同的解决方案是:
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-";