2015-10-14 191 views
1

我只是做一個程序來猜測數組中的一些隨機對,如果猜對了,刪除這一對。scanf混淆類型錯誤

我遇到了一個問題,我只能輸入整數。每次嘗試鍵入*時,程序都會崩潰。我使用如下條件:

if (scanf("%d",&temp)==1) 

嘗試解決我的問題,但它確實沒有用。

這裏是我的代碼,並請給我一些幫助:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
    int r[4]; //random 
    int s[8]; //store 
    char c[8]; //cover 
    int g[8]; //guess 
    int i; 
    int round=0; 
    int left = 4; 
    int point = 0; 
    int clear_index[2]; 
    int temp; 

// generate random number 
for (i=0;i<4;i++) 
{ 
    r[i] = (rand()%10)+1; 
    s[i] = r[i]; 
    s[i+4] = r[i]; 
} 
// show the default number 
printf("[show] "); 
for (i=0;i<8;i++) 
{ 
    printf("%d ",s[i]); 
    c[i] = '*'; 
} 
printf("\n"); 

while(left>0) 
{ 
    // print left 
    printf("[cover] "); 
    for (i=0;i<8;i++) 
     printf("%c ",c[i]); 
    printf("\n"); 
    //guess 
    printf("[guess] "); 
    for(i=0;i<8;i++) 
    { 
     if (scanf("%d",&temp)==1) 
      g[i] = temp;   

     if (g[i] == s[i]) 
     { 
      printf("v\n"); 
      clear_index[point] = i; 
      point++; 
     } 
    } 
    if (point == 2) 
    { 
     for (i=0;i<2;i++) 
      c[clear_index[i]]=' '; 
     left-=1; 
     point = 0;   
    } 
    round+=1; 
    //left-=1; 
} 
printf("you won in %d round",round);  

}

+0

這個'scanf(「%d」,&temp)'是爲了得到你輸入的整數。你想輸入數字還是字符? –

+0

我嘗試過濾出非整數。 – KennyYang

+0

以「for(i = 0; i <8; i ++)」開頭的循環可以將8個值設置爲「int clear_index [2];',但是clean_index只能包含2個值。 I.E.在調用未定義行爲的數組末尾寫入。這可能導致seg故障事件。 – user3629249

回答

1

你得到分段錯誤,因爲,在情況下,你沒有輸入一個整數,scanf函數將不會返回1 ,然後,使用g[i]將調用undefined behavior

FWIW,g是一個局部自動數組變量,除非明確初始化,否則將具有不確定的值。嘗試讀取該值將調用UB。

解決方案:

  1. 總是初始化局部變量。
  2. 如果scanf()失敗,你需要使用像while (getchar != '\n');一些循環在繼續採取下一步輸入之前吃起來無效輸入。
+0

我不知道我可以在哪裏添加while循環?我應該在if(scanf(「%d」,&temp)== 1)之前添加它嗎? – KennyYang

+0

@KennyYang nope。在scanf相關if語句的else部分中。 –

+0

我不知道如何吃掉那些無效的輸入,我只是想在輸入無效時不做任何事情。我嘗試像這樣: else { char c; ((c = getchar())!='\ n') c ='\ n'; } 通過將輸入分配爲'\ n'來吞噬無效輸入是否正確? – KennyYang

0

您正在閱讀一個數字,但用戶可以放置一個數字。爲防止出現這種情況,您可以使用庫stdlib.h中的函數atoi()。它將字符串轉換爲整數,如果整數只是數字,它會將其轉換爲整數。如果它是一個字符,它將返回0.所以你只需要在atoi()函數被調用後防止出現0。