String Concatenation Oddities

时间:2014-07-02 22:26:05

标签: c string char concatenation

我放弃了,我只是不知道为什么这不起作用:

int main(){
    int i;
    char destination[1000];
    char* str = "S:15 B:20 B A:15",letra;
    for (i=0;i<strlen(str);i++){
        letra = str[i];
        printf("%c",letra);
        strcat(destination,letra);
    }
    printf("%s",destination);
    return 0;
}

我只是希望能够将字符串连接到其他字符串,这只需要一个字符串并将char字符串复制到另一个空字符串(具有足够的大小),但它无论出于何种原因都不起作用。如果不使用“letra”我在strcat中使用文字字符串,它可以工作,但是如果我使用“letra”它会失败,即使“letra”是一个有效的字符,如果我printf“letra”它也能正常工作。

任何人都可以帮我一把吗?我完全陷入困境,我错过了一些简单但我不知道它是什么。

2 个答案:

答案 0 :(得分:2)

您的代码存在一些问题:

  1. destination未初始化,因此对strcat的调用无效。您必须提供有效的C字符串作为第一个参数。
  2. strcat对C字符串进行操作,而不是char。因此,您无法将letra作为第二个参数传递。
  3. 每次循环时都会调用strlen(str)
  4. 使用strcat一次添加字符的效率极低。
  5. 在这个例子中,循环本身是没有意义的,因为它可以被单个strcpy调用替换。但我从评论中了解到,在实际代码中,您希望以条件方式添加字符。这将涉及迭代源字符串,此时您最好以类似的方式填充目标字符串。

    您可以编写如下代码:

    size_t i = 0;
    char destination[1000];
    const char* str = "S:15 B:20 B A:15";
    const char* p = str;
    while (p)
    {
        if (appendThisChar(*p))
            destination[i++] = *p;
        p++;
    }
    destination[i] = '\0';
    

    为了简单起见,我忽略了对缓冲区溢出的任何检查,但显然在实际代码中你会确保你不能在缓冲区的末尾写入。

答案 1 :(得分:-1)

修正了它:

char temp[ 2 ];
temp[ 0 ] = letra;
temp[ 1 ] = '\0';
strcat(destination,temp);