2017-04-12 86 views
0

阵列[a][b]应该在两个单独的行上分别输入4个数字,并输出?A?B,如在着名的数字猜测游戏中。 (例如,1234\n1347应该输出1A2B。)但是,我发现1a[0]被替换为\0而其他人仍然很好。 (边注:这发生在了XCode,但不能在Visual Studio中)C阵列第一个输入“ 0”

#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]解决了这个问题,但我想知道这是怎么回事。谢谢!

+1

所有问题的根源:'scanf(“%s%s”,a,b);' –

+1

您能告诉我更多吗? –

回答

3

C中的字符串实际上被称为null terminated byte strings。这个名字暗示了这个字符串有一个特殊的终结符,它是'\0'这个字符。

由四个字符组成的字符串需要空间用于五个个字符,第五个字符为空终止符。

当您输入四个字符与您的scanf调用时,该函数将写入第五个(终止符)越界。并写出界限导致未定义的行为

+0

是否有任何理由将它移动到阵列a的前端? –

+2

@BrianHo *未定义的行为*由于其定义未定义。但是很可能数组“b”在内存中的“a”之前,并且“b”的终止符被写入“a”的第一个元素。但是,该内存布局不应该被计算在内,它是编译器特定的实现细节,可以在平台,编译器之间或甚至在将当前编译器更新为新版本之后进行更改。 –