Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在C中使用printf时字符串会被打印两次?_C_Printf - Fatal编程技术网

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

为什么在C中使用printf时字符串会被打印两次?,c,printf,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 s

我的程序要求用户提供一个字符串,该字符串将被复制到一个字符数组中。然后,使用
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;
}
intmain(){
int i;
字符string1[4],string2[4];
//获取第一个字符串
printf(“插入字符串:”);
scanf(“%s”,string1);
//将值复制到第二个数组中
对于(i=0;i<4;i++){
string2[i]=string1[i];
}
//打印第二个字符串
printf(“%s”,string2);
返回0;
}
但是,当我使用
printf()
函数打印字符串时,字符串会被打印两次

假设我输入了这个单词

栅栏

输出将是

酒吧

为什么会这样

char string1[4], string2[4];
4元素字符数组不足以容纳4个字符的字符串。您还需要一个字符来终止
'\0'
字符

为什么?

TL;DR答案:

为了解释,这里的问题是,对于定义为
string1[4]
(仅4个元素)的输入数组,类似于
条的输入字符串将溢出分配的内存区域(试图存储终止的
\0
),这反过来调用

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

scanf("%3s", string1);
输出:

b字符串:stringstring

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

char bString []= {'s','t','r','i','n','g','\0'};    
或者干脆写:

char bString [] = "string";
char bString [] = "string";