strcat将char连接到字符串上?

时间:2011-01-29 02:48:52

标签: c string char concatenation strcat

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

strcat(string,&currentChar);

鉴于该字符串被初始化为

char * string = "";

和currentChar是

char currentChar = 'B';

为什么会导致分段错误?

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

7 个答案:

答案 0 :(得分:12)

正如其他人所做的那样,& currentChar char char * 的指针,但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 );

答案 1 :(得分:8)

由于&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");

答案 2 :(得分:1)

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

由于你不知道内存甚至引用了什么,你应该在代码访问它时遇到问题。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

这有效:

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

答案 5 :(得分:0)

我们知道 currentChar = 'B'。

这是可以的

strcat(string, "B\0");

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

答案 6 :(得分:-1)

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

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

char buf[1024];

strcat(buf, "");
strcat(buf, "B");