数组[a]
和[b]
应该在两个单独的行中分别接收4个数字,并输出?A?B
,就像在着名的数字猜谜游戏中一样。 (例如,1234\n1347
应该输出1A2B
。)但是,我发现1
上的a[0]
被\0
取代而其他人仍然没有。 (附注:这发生在XCode上,但不发生在Visual Studio上。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[4], b[4];
int i, j;
int A = 0, B = 0;
scanf("%s%s",a,b);
for(i=0;i<4;i++)
if(a[i] == b[i])
A++;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i] == b[j])
B++;
B = B-A;
printf("%dA%dB\n",A,B);
return 0;
}
将数组更改为大小[5]
可以解决问题,但我想了解发生了什么。谢谢!
答案 0 :(得分:3)
C中的字符串实际上称为null terminated byte strings。该名称提示字符串有一个特殊的终结符,即'\0'
字符。
四个字符的字符串需要五个字符的空间,第五个字符是空终止符。
当您使用scanf
调用输入四个字符时,该函数将写入第五个(终止符)越界。写出界限会导致未定义的行为。