我的程序要求用户提供字符串,它将被复制到一个字符数组中。然后,使用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
为什么会这样?
答案 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";