用strcat分割故障

用strcat分割故障,c,segmentation-fault,concatenation,strcat,C,Segmentation Fault,Concatenation,Strcat,这是我的密码: char *name, name_log="log-"; ------正在从用户获取“名称”----- 我需要的是name_log=“log-'name.log”,但我得到了一个分段错误:(。我做错了什么,我该如何修复它?Thx您需要所有存储空间。您不能以这种方式添加到字符串,因为添加的字符串进入了尚未分配的内存 你能行 char[20] strarray; strcat(strarray, "log-"); strcat(strarray, "abcd"); 您需要all

这是我的密码:

char *name, name_log="log-";
------正在从用户获取“名称”-----


我需要的是name_log=“log-'name.log”,但我得到了一个分段错误:(。我做错了什么,我该如何修复它?Thx

您需要所有存储空间。您不能以这种方式添加到字符串,因为添加的字符串进入了尚未分配的内存

你能行

char[20] strarray;

strcat(strarray, "log-");
strcat(strarray, "abcd");

您需要allcocate内存。您不能以这种方式添加到字符串,因为添加的字符串将进入尚未分配的内存

你能行

char[20] strarray;

strcat(strarray, "log-");
strcat(strarray, "abcd");

字符串文本被分配了固定数量的内存,通常在只读部分中,您需要使用缓冲区

char buffer[64] = "log-";
strncat(buffer,".log",32);

另一方面,
strcat
通常是不安全的,您需要使用一些东西来检查它使用的缓冲区的大小或限制它可以连接的内容,例如
strncat
字符串文本被分配了固定数量的内存,通常在只读部分中,您需要使用缓冲区

char buffer[64] = "log-";
strncat(buffer,".log",32);
另一方面,
strcat
通常是不安全的,如果这是您的代码,您需要使用一些东西来检查它使用的缓冲区的大小或限制它可以连接的内容,例如
strncat

char *name, name_log="log-";
然后,
name\u 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 *name, name_log="log-";
然后,
name\u 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
确保您有足够的空间安全地执行所有字符串操作,三个组件有足够的字符加上一个空终止符。

名称\u log指向一个静态位置:“log-”,这意味着不能修改is,而作为
strcat()
中的第一个参数,它必须是可修改的

尝试将日志的类型
char*
更改为
char[]
,例如

char[20] name_log = "log-";

名称\u log指向一个静态位置:“log-”,这意味着不能修改is,而作为strcat()中的第一个参数,它必须是可修改的

尝试将日志的类型
char*
更改为
char[]
,例如

char[20] name_log = "log-";

一个完全不同的解决方案是:

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"

一个完全不同的解决方案是:

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"


此外,当这样声明时,
name\u log
的类型是
char
。这甚至不应该编译。@Simon:事实上我认为它是正确的。我现在正在吃我自己的话。但是类型是char*,所以我认为应该可以。请将strarray初始化为空字符串(
strarray[0]='\0'
或类似),然后再将其与strcat一起使用。(或使用strncpy而不是第一个strcat)。此外,请使用strncat而不是strcat。
char[20]strarray
?您的意思不是
char strarray[20]
?这就是为什么人们写
char*a
而不是
char*a
的原因。此外,
name\u log
在这样声明时是
char
类型。这甚至不应该编译。@Simon:事实上我认为它是正确的。我现在正在吃我自己的话。但是类型是char*,所以我认为应该可以。请e在与strcat一起使用之前,请将strray初始化为空字符串(
strray[0]='\0'
或类似)。或者使用strncpy而不是第一个strcat。另外,请使用strncat而不是strcat。
char[20]stray
?你的意思是
char-strray[20]
?这就是为什么人们写
char*a
而不是
char*a
的原因。呸!Wimp!
strcat
只有在你不知道缓冲区足够大的情况下才是不安全的。真正的C程序员会嘲笑这样的评论:-)@paxdiablo:没错,但他是个初学者,不是真正的C程序员:P
strncat()
无论如何都已损坏,最好使用
strlcat()
@JeremyP:这是一个标准函数吗?因为我从未见过它before@Necrolis:我原以为它是Posix标准,但似乎不是。不过它在大多数Unix上都可用。呸!Wimp!
strcat
只有在你不知道缓冲区足够大的情况下才不安全。真正的C程序员会嘲笑这样的评论:-)@paxdiablo:没错,但他是一个初学者,不是一个真正的C程序员:P
strncat()
无论如何都是坏的,最好使用
strlcat()
@JeremyP:这是一个标准函数吗?因为我从未见过它before@Necrolis:我以为这是Posix标准,但似乎不是。这是有用的