strcat 将字符连接到字符串上?

问题描述 投票:0回答:8

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

strcat(string,&currentChar);

假设字符串被初始化为

char * string = "";

当前Char是

char currentChar = 'B';

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

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

c string char concatenation strcat
8个回答
17
投票

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

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

示例:

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

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

适用于您的问题:

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

cToStr 将假定字符串“B”:

cToStr[0] = currentChar;

strcat 可以工作!

strcat ( string, cToStr );

10
投票

因为

&currentChar
不是字符串,所以它不以
\0
字符结尾。您应该将
B
定义为
char *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");

3
投票

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

sprintf

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


2
投票

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

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

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


0
投票

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

这有效:

char string[10] = "";
char* currentChar = "B";
strcat(string, currentChar);

0
投票

我们知道 currentChar = 'B'。

这可以做到

strcat(string, "B\0");

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


0
投票

创建自己的函数。

void strcatc(char *s, char c) {
    while (*s != 0) s++;
    *s++ = c;
    *s = 0;
}

-1
投票

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

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

char buf[1024];

strcat(buf, "");
strcat(buf, "B");
© www.soinside.com 2019 - 2024. All rights reserved.