2013-10-20 20 views
0

我正在嘗試編寫一個簡單的演示程序,在輸入指定字符時會跳出一個循環。我能夠成功地做到這一點,直到我想添加額外的條件,我沒有超過我的數組。當我輸入指定的字符時,這段代碼不會跳出循環,我不知道爲什麼。代碼的邏輯和設置看起來很合理!如何通過終止字符打破循環?

#include <stdio.h> 

char input[10]; 
char breakout = '!'; 
int idx; 

int main(void) 
{ 
printf("Input characters until %c character is used to break out", breakout); 

for(idx = 0; input[idx] != breakout && idx < 10; idx++) 
{ 
    scanf("%c", &input[idx]); 
} 

printf("Program terminated:"); 

getchar(); 
return 0; 
} 

看來好像for循環的條件應該在進入'!'後評估錯誤。性格,但事實並非如此。謝謝你們

+1

初始化'input'或由於第一循環測試 –

回答

2

進入之前的字符,如果你使用一個do-while循環後就可以

idx = 0; 
do 
{ 
    scanf("%c\n", &input[idx]); 
} 
while(input[idx++] != breakout && idx < 10); 
+0

謝謝你的幫助@Musa您會進入垃圾值,但是我試圖用你建議的調整,它仍然沒有打破當我使用分組字符時,循環的一部分。可能是..我的編譯器? –

+1

@SmithWillSuffice我有一個錯誤,看到更新的答案 – Musa

+0

太好了。這解決了它。我會改變我的最佳答案,以便誰可以回答我在代碼中遇到的其他困境。我的數組大小爲10.當我執行代碼時,它只允許我在代碼終止之前輸入5個輸入(數組的一半大小)。所以我嘗試將數組大小更改爲20.然後我可以輸入10個輸入(也是數組大小的一半)。爲什麼是這樣?我認爲'指針/數組'算術不會允許這樣做。 –

2

作出比較想想你的循環條件您正在測試的條件。你的input[idx]總是看着數組中的下一個位置(它還沒有包含一個字符) - 而不是從scanf調用接收到的前一個字符,它可以在input[idx - 1]找到。但是當然你不能在第一次迭代時檢查input[idx - 1],所以要注意這一點。

for(idx = 0; (idx == 0 || input[idx - 1] != breakout) && idx < 10; idx++) 
{  
    ... 
} 

超級複雜的循環條件很少或多或少爲此一個好主意 - 那idx++迭代步驟的條件的評估之前發生,它可能會造成混淆。使用do/while或在循環中有一箇中斷條件。

+0

謝謝你的回覆。我需要進一步的解釋,因爲我對理解for循環條件的評估顯然存在缺陷。我認爲檢查將檢查輸入[idx]和不輸入[idx -1]。 –

1

您應該在輸入字符後測試條件。我修改您的代碼:

#include <stdio.h> 
char input[10]; 
char breakout = '!'; 
int idx; 

int main(void) 
{ 
    printf("Input characters until %c character is used to break out", breakout); 

    for(idx = 0; idx < 10; idx++) 
    { 
      scanf("%c", &input[idx]); 
      if(input[idx] == '!') 
       break; 
    } 
    printf("Program terminated:"); 

    getchar(); 
    return 0; 
} 
+0

謝謝你的幫助。然而,代碼只允許我輸入5個字符,而不是10個在終止之前?數組設置爲10,所以爲什麼只允許5個輸入是沒有意義的?我深陷不安。 –

+1

這個問題是不清除緩衝區。您可以在scanf(getchar)語句之前添加以下代碼:如果您的操作系統是Linux:__ fpurge(stdin);它將清除緩衝區。注意:在fpurge之前有兩個'_'。你應該包括;如果你的操作系統是windows:fflush(stdin); – baifuyou