使用 GDB,我发现在尝试此操作时出现分段错误:
strcat(string,¤tChar);
鉴于该字符串被初始化为
char * string = "";
和 currentChar 是
char currentChar = 'B';
为什么这会导致分段错误?
如果 strcat 不能用于此,我还能如何将 char 连接到字符串上?
使用 GDB,我发现在尝试此操作时出现分段错误:
strcat(string,¤tChar);
鉴于该字符串被初始化为
char * string = "";
和 currentChar 是
char currentChar = 'B';
为什么这会导致分段错误?
如果 strcat 不能用于此,我还能如何将 char 连接到字符串上?
正如其他人所回应的那样,¤tChar是指向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 );
因为¤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");
strcat() 接受两个以 '\0' 结尾的字符串。当您传递一个字符的地址时,该例程将查看该字符后面的内存,寻找终止符。
由于您甚至不知道该内存指的是什么,因此当您的代码访问它时应该会出现问题。
除此之外,您的字符串参数没有空间可以附加任何字符。那个内存写到哪里了?它将尝试写入与此字符串关联的内存的末尾。
我认为最简单的方法(效率不高)是sprintf
sprintf(str, "%s%c", str, chr);
两个字符串都必须以空值结尾。单个 char 不是以 null 结尾的,因此当 strcat 停止将字符连接到末尾时,它是未定义的。此外,字符串必须至少为原始字符串和结果字符串包含足够的空间。
这有效:
char string[10] = "";
char* currentChar = "B";
strcat(string, currentChar);
我们知道 currentChar = 'B'。
这可以做到
strcat(string, "B\0");
如果我们知道 currentChar 将被硬编码为“B”,这将是一个好方法。
它还消除了对 char currentChar = 'B'; 的需要。
strcat 的第一个参数必须有足够的空间来保存字符串的其余部分。"" 是一个常量字符串,因此 GCC 不分配空间。
使其成为一个有足够空间的数组:
char buf[1024];
strcat(buf, "");
strcat(buf, "B");