2017-04-12 85 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」的第一個元素。但是,該內存佈局不應該被計算在內,它是編譯器特定的實現細節,可以在平臺,編譯器之間或甚至在將當前編譯器更新爲新版本之後進行更改。 –