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