为什么在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";