使用GDB,我觉得我得到一个分段错误,当我尝试这样操作:strcat将字符串转换为字符串?
strcat(string,¤tChar);
鉴于该字符串初始化为
char * string = "";
和currentChar是
char currentChar = 'B';
为什么这会导致分段错误?
如果strcat不能用于这个,我怎么能连接一个字符到一个字符串?
使用GDB,我觉得我得到一个分段错误,当我尝试这样操作:strcat将字符串转换为字符串?
strcat(string,¤tChar);
鉴于该字符串初始化为
char * string = "";
和currentChar是
char currentChar = 'B';
为什么这会导致分段错误?
如果strcat不能用于这个,我怎么能连接一个字符到一个字符串?
因为¤tChar
不是字符串,所以不会以\0
字符结束。您应该将B
定义为char *currentChar = 'B';
。也根据http://www.cplusplus.com/reference/clibrary/cstring/strcatstring
应该有足够的空间来容纳结果字符串(在这种情况下是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");
不是该程序的原因。这是错误的一部分,虽然 – 2011-01-29 03:00:15
@Foo`&currentChar`不指向null终止字符串,当然strcpy会导致seg错误 – Elalfer 2011-01-29 03:03:58
我接受这个答案,因为它涵盖了答:我需要空终止符,并且B:我不得不分配更多的空间来放置字符串。 – Blackbinary 2011-01-29 03:13:48
的strcat()有两个“\ 0'结尾的字符串。当你传递一个字符的地址时,例程会查看字符后面的内存,寻找终止符。
由于您不知道该内存甚至指的是什么,因此在代码访问时应该会遇到问题。
除此之外,您的字符串参数没有空间可以添加任何字符。写入内存的地方在哪里?它将尝试写入超过与此字符串关联的内存的末尾。
这两个字符串必须以空字符结尾。一个字符不是空终止的,所以当strcat停止将字符连接到结尾时它是未定义的。此外,字符串必须至少包含原始字符串和结果字符串的足够空间。
这工作:
char string[10] = "";
char* currentChar = "B";
strcat(string, currentChar);
的strcat的第一个参数必须有足够的空间来容纳字符串的其余部分。 “”是一个常量字符串,因此GCC不分配空间。
使它有足够的空间的阵列:
char buf[1024];
strcat(buf, "");
strcat(buf, "B");
作为回应他人,& currentChar是指向炭或字符*,但在C的字符串是的char [ ]或const char *。
一种方法使用的strcat来连接一个焦炭到串是创建一个最小字符串,并用它来一个字符转换成字符串。
实施例:
制作一个简单的字符串,只有1个字符和后缀'\ 0';
char cToStr[2];
cToStr[1] = '\0';
应用到你的问题:
char * string = "";
char currentChar = 'B';
cToStr将承担字符串 “B”:
cToStr[0] = currentChar;
而且strcat的将工作!
strcat (string, cToStr);
我认为最简单的方法(效率不高)将sprintf
sprintf(str, "%s%c", str, chr);
strcat的要求空值终止字符串。你的单个字符没有null,所以strcat将继续复制,直到它找到一个空行,这可能是偶然的第二个字节,或者几个千字节,一直拷贝所有垃圾到你的字符串中,跺脚堆栈 – 2011-01-29 02:52:51