数组 [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]
解决了问题,但我想了解发生了什么。谢谢!
最佳答案
C 中的字符串实际上叫做null terminated byte strings .该名称暗示字符串有一个特殊的终止符,即 '\0'
字符。
四个字符的字符串需要 五个 个字符的空间,第五个字符是空终止符。
当您使用 scanf
调用输入四个字符时,该函数将写入第五个(终止符)越界。越界写入会导致未定义的行为。
关于C 数组第一个输入 "\0",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43364873/