12

使用 GDB,我发现在尝试此操作时出现分段错误:

strcat(string,&currentChar);

鉴于该字符串被初始化为

char * string = "";

和 currentChar 是

char currentChar = 'B';

为什么这会导致分段错误?

如果 strcat 不能用于此,我还能如何将 char 连接到字符串上?

4

7 回答 7

17

正如其他人所回应的那样,¤tChar是指向charchar*的指针,但 C 中的字符串是char[]const char*

使用 strcat 将char连接到字符串的一种方法是创建最小字符串并使用它将 char 转换为字符串。

例子:

制作一个简单的字符串,只有 1 个字符和后缀'\0'

char cToStr[2];
cToStr[1] = '\0';

适用于您的问题:

char * string = "";
char currentChar = 'B';

cToStr 将假定字符串“B”:

cToStr[0] = currentChar;

而且 strcat 会工作!

strcat ( string, cToStr );
于 2014-03-15T21:01:21.077 回答
10

因为&currentChar不是字符串,所以它不会以\0字符结尾。你应该定义Bchar *currentChar = 'B';. 同样根据http://www.cplusplus.com/reference/clibrary/cstring/strcat string应该有足够的空间来保存结果字符串(在这种情况下为 2 个字节),但它只有 1 个字节。

或者,如果您想使用,char那么您可以执行以下操作(取决于您的代码):

char string[256];
...

char currentChar = 'B';
size_t cur_len = strlen(string);
if(cur_len < 254) {
    string[cur_len] = currentChar;
    string[cur_len+1] = '\0';
}
else
    printf("Not enough space");
于 2011-01-29T02:51:20.717 回答
2

strcat() 接受两个以 '\0' 结尾的字符串。当您传递一个字符的地址时,该例程将查看该字符后面的内存,寻找终止符。

由于您甚至不知道该内存指的是什么,因此当您的代码访问它时应该会出现问题。

除此之外,您的字符串参数没有空间可以附加任何字符。那个内存写到哪里了?它将尝试写入与此字符串关联的内存的末尾。

于 2011-01-29T02:52:05.677 回答
1

我认为最简单的方法(效率不高)是sprintf

sprintf(str, "%s%c", str, chr);

于 2016-04-05T01:50:14.617 回答
0

两个字符串都必须以空值结尾。单个 char 不是以 null 结尾的,因此当 strcat 停止将字符连接到末尾时,它是未定义的。此外,字符串必须至少为原始字符串和结果字符串包含足够的空间。

这有效:

char string[10] = "";
char* currentChar = "B";
strcat(string, currentChar);
于 2011-01-29T02:52:18.467 回答
0

我们知道 currentChar = 'B'。

这可以做到

strcat(string, "B\0");

如果我们知道 currentChar 将被硬编码为“B”,这将是一个好方法。
它还消除了对 char currentChar = 'B'; 的需要。

于 2021-01-28T10:38:04.487 回答
-1

strcat 的第一个参数必须有足够的空间来保存字符串的其余部分。"" 是一个常量字符串,因此 GCC 不分配空间。

使其成为一个有足够空间的数组:

char buf[1024];

strcat(buf, "");
strcat(buf, "B");
于 2011-01-29T02:53:09.310 回答