2011-01-29 21 views
6

使用GDB,我觉得我得到一个分段错误,当我尝试这样操作:strcat将字符串转换为字符串?

strcat(string,&currentChar); 

鉴于该字符串初始化为

char * string = ""; 

和currentChar是

char currentChar = 'B'; 

为什么这会导致分段错误?

如果strcat不能用于这个,我怎么能连接一个字符到一个字符串?

+3

strcat的要求空值终止字符串。你的单个字符没有null,所以strcat将继续复制,直到它找到一个空行,这可能是偶然的第二个字节,或者几个千字节,一直拷贝所有垃圾到你的字符串中,跺脚堆栈 – 2011-01-29 02:52:51

回答

4

因为&currentChar不是字符串,所以不会以\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"); 
+0

不是该程序的原因。这是错误的一部分,虽然 – 2011-01-29 03:00:15

+0

@Foo`&currentChar`不指向null终止字符串,当然strcpy会导致seg错误 – Elalfer 2011-01-29 03:03:58

+0

我接受这个答案,因为它涵盖了答:我需要空终止符,并且B:我不得不分配更多的空间来放置字符串。 – Blackbinary 2011-01-29 03:13:48

1

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

由于您不知道该内存甚至指的是什么,因此在代码访问时应该会遇到问题。

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

-1

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

这工作:

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

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

使它有足够的空间的阵列:

char buf[1024]; 

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

作为回应他人,& 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); 
0

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

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