这是我的代码:
char *name, name_log="log-";
------从用户获取'name'-----
strcat(name_log, name);
char ext[] = ".log";
strcat(name_log, ext);
我最终需要的是name_log =“log-'name'.log”,但我得到了一个分段错误错误:((。我做错了什么,我该如何解决?Thx
答案 0 :(得分:3)
字符串文字被分配了固定数量的内存,通常在只读部分,你需要使用缓冲区。
char buffer[64] = "log-";
strncat(buffer,".log",32);
另一方面,strcat
通常是不安全的,您需要使用能够检查其使用的缓冲区大小的内容,或限制它可以连接的内容,例如strncat
。
答案 1 :(得分:2)
首先,如果此是您的代码:
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
确保您有足够的空间安全地执行所有字符串操作,三个组件的足够字符加上空终止符。
答案 2 :(得分:2)
完全不同的解决方案是:
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"
答案 3 :(得分:0)
你需要全部分配内存。您无法以这种方式添加到字符串,因为添加的字符串将转到尚未分配的内存中。
你可以做到
char[20] strarray;
strcat(strarray, "log-");
strcat(strarray, "abcd");
答案 4 :(得分:0)
name_log指向静态位置:“log-”,表示无法修改,而作为strcat()
中的第一个参数,它必须是可修改的。
尝试将name_log的类型char*
更改为char[]
,例如
char[20] name_log = "log-";