使用GDB,我发现在尝试此操作时出现了分段错误:
strcat(string,¤tChar);
鉴于该字符串被初始化为
char * string = "";
和currentChar是
char currentChar = 'B';
为什么会导致分段错误?
如果strcat不能用于此,我怎样才能将char连接到字符串上?
答案 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)
由于¤tChar
不是字符串,因此不会以\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");