2013-04-21 39 views
-3

這主要是出於好奇,爲什麼會發生這種情況,因爲它對我而言並不重要。如果我輸入了一個無效的數字,它會正確地轉到重複標籤並要求我再次輸入一個數字,但是如果我輸入了像'f'這樣的字符,它將無休止地循環而不停止。爲什麼是這樣?當在C中輸入字符時,代碼循環

這裏的數組和所有變量都是int類型的。

repeat: 
    printf("Enter number of available space, you are %c: ", userXO); 
    scanf("%d", user); 

    switch (*user) 
    { 
     case 1: if (spaces[0][0] == 49){ spaces[0][0] = userXO;}else goto repeat; break; 
     case 2: if (spaces[0][1] == 50){ spaces[0][1] = userXO;}else goto repeat; break; 
     case 3: if (spaces[0][2] == 51){ spaces[0][2] = userXO;}else goto repeat; break; 
     case 4: if (spaces[1][0] == 52){ spaces[1][0] = userXO;}else goto repeat; break; 
     case 5: if (spaces[1][1] == 53){ spaces[1][1] = userXO;}else goto repeat; break; 
     case 6: if (spaces[1][2] == 54){ spaces[1][2] = userXO;}else goto repeat; break; 
     case 7: if (spaces[2][0] == 55){ spaces[2][0] = userXO;}else goto repeat; break; 
     case 8: if (spaces[2][1] == 56){ spaces[2][1] = userXO;}else goto repeat; break; 
     case 9: if (spaces[2][2] == 57){ spaces[2][2] = userXO;}else goto repeat; break; 
     default: goto repeat; break; 
} 
+0

無論發生什麼縮進?該代碼幾乎不可讀。 – sapi 2013-04-21 01:14:01

+8

你爲什麼要使用[goto](http://stackoverflow.com/questions/3517726/what-is-wrong-with-using-goto)?爲什麼?! WHYYYY? – timss 2013-04-21 01:15:18

+1

@sapi它是縮進的。如果你正在談論if語句,它不是很複雜,我沒有縮進,所以它可以放在屏幕上。 – 0x41414141 2013-04-21 01:16:07

回答

5

scanf("%d", user);嘗試讀取的數,發現一個char(f),葉它在緩衝器並結束。循環然後循環並再次執行scanf("%d", user);。並再次...

+0

「緩衝區溢出」是什麼? – 0x41414141 2013-04-21 01:22:36

+2

@ bh3244不,當您嘗試訪問超過數組末尾的元素時,會發生「緩衝區溢出」。 – Kevin 2013-04-21 01:25:10

2

這裏是我會寫你做了什麼:

int rc, user; 
char buf[100]; 

for (;;) // repeat until explicitly broken out of 
{ 
    printf ("Enter number of available space; you are %c: ", userXO); 
    if (!fgets (buf, sizeof buf, stdin)) /* end of file or i/o error? */ 
     break; 

    rc = sscanf(buf, "%d", &user); 
    if (rc != 1) /* other than one parsed input item is an error */ 
    { 
     printf ("invalid number; try again\n"); 
     continue; 
    } 

    /* 
    * this switch has the odd property of potentially 
    * doing all 9 cases for case 1, 8 cases for case 2, etc. 
    * Maybe explicit breaks for success are needed? 
    */ 
    switch (user) 
    { 
    case 1: if (spaces[0][0] == 49) spaces[0][0] = userX0; else continue; 
    case 2: if (spaces[0][1] == 50) spaces[0][1] = userX0; else continue; 
    case 3: if (spaces[0][2] == 51) spaces[0][2] = userX0; else continue; 
    case 4: if (spaces[1][0] == 52) spaces[1][0] = userX0; else continue; 
    case 5: if (spaces[1][1] == 53) spaces[1][1] = userX0; else continue; 
    case 6: if (spaces[1][2] == 54) spaces[1][2] = userX0; else continue; 
    case 7: if (spaces[2][0] == 55) spaces[2][0] = userX0; else continue; 
    case 8: if (spaces[2][1] == 56) spaces[2][1] = userX0; else continue; 
    case 9: if (spaces[2][2] == 57) spaces[2][2] = userX0; else continue; 
    default: continue; 
    } 
    break; /* if valid case(s) taken, exits loop */ 
} 

正如你所看到的,也沒有必要爲一個標籤或goto語句。代碼也更緊湊。