为什么在C中使用printf时字符串会被打印两次?

时间:2015-05-14 16:15:19

标签: c printf

我的程序要求用户提供字符串,它将被复制到一个字符数组中。然后,使用for循环,程序只是将第一个数组的元素复制到第二个数组中。

int main() {

    int i;
    char string1[4], string2[4];

    // Get the first string
    printf("Insert your string: ");
    scanf("%s", string1);

    // Copy the values into the second array
    for (i = 0; i < 4; i++) {
        string2[i] = string1[i];
    }

    // Print the second string
    printf("%s", string2);
    return 0;
}

但是,当我使用printf()函数打印字符串时,字符串会被打印两次。

假设我输入了

这个词
  

输出

  

barsbars

为什么会这样?

3 个答案:

答案 0 :(得分:6)

char string1[4], string2[4];

对于4个字符的字符串,4元素字符数组是不够的。对于终止'\0'字符,您还需要一个。

答案 1 :(得分:4)

  

为什么?

TL; DR 回答:undefined behaviour

为了解释这里的问题,输入数组定义为string1[4],(仅4个元素),输入字符串如bars将超出分配的内存区域(试图存储终止\0),然后调用undefined behaviour

您应始终注意输入缓冲区长度,例如string1[4]的输入数组,scanf()应该是

scanf("%3s", string1);

答案 2 :(得分:2)

char bString []= {'s','t','r','i','n','g'};               
printf("bString:%s\n", bString);

输出:

  

bString:stringstring

解决方案:始终包含终止字符

char bString []= {'s','t','r','i','n','g','\0'};    

或者简单地写一下:

char bString [] = "string";