2015-09-19 60 views
-1

我寫了一個平衡符號檢查器和堆棧。其他一切正常,我已經完全測試了所有的功能,比如流行推消滅isempty。問題是我的fgets使用情況。fgets在c中的使用出錯

//fgets 
char input[10]; 
printf("Enter a 10 character input for balance: "); 
fgets(input, 10, stdin); 

是部分「不工作」是下面的代碼

int i = 0; 
for (i < 10; i++;){ 
    if (input[i] == '{' || input[i] == '[' || input[i] == '(' || input[i] == '<'){ 
     push(&st2, input[i]); 

    } 
} 

我知道我的推送功能是否正常工作,因爲我已經測試了它作爲一個獨立的。像這樣:

push(&st2, '{'); 

當我嘗試顯示我的堆棧並正確地推送值時工作得很好。 在這一點上,我想或者初始字符數組與fgets是隻是不正確初始化,或者我設法搞砸if/for循環。

當我運行該程序的if語句的條件,如果我鍵入{[(或<到標準輸入。當我嘗試打印我們輸入[10]字符數組我的程序剛剛崩潰藏漢從未謀面。

+0

你檢查與fgets(輸入,10,標準輸入)!= NULL? – CIsForCookies

+2

'input'只能存儲9個字符的輸入(後跟''\ 0''終止符)。 – melpomene

回答

4

for循環是錯誤的。

嘗試

int i; 
for (i = 0; i < 10; i++) { 
    ... 
} 

代替。

正確的語法爲

for (initialisation; condition; increment) { 
    body 
} 

所以,如果你這樣寫:

int i = 0; 
for (i < 10; i++;) { 
    ... 
} 

會發生以下情況:

首先初始化發生。 i < 10被執行,但它是一個簡單的邏輯表達式,其計算結果爲true並被忽略。然後檢查條件。 i++的計算結果爲0(不是1,因爲增量),這被解釋爲false,循環終止。

+0

我不明白這是如何改變的。我被教導你可以在for循環之外初始化我。 – user3457828

+0

@ user3457828是的,但你至少需要一個**; **更多這將是**爲(;我<10;我++)**你看到不同之處?在你的代碼中;在最後使用。 – Michi

0

代碼中存在很多問題。

1)

char input[10]; 
printf("Enter a 10 character input for balance: "); 

應該是:

char input[11]; 

您需要的 '\ 0' 了。

2)

fgets(input, 10, stdin); 

經常檢查回報:

if (fgets(input, 10, stdin) != NULL){} 

3)

for (i < 10; i++;){} 

是錯誤的,它應該是:

for (;i < 10; i++){} 

你看到了區別嗎?

現在我們可以把它們放在一起:

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

int main(void){ 
    char input[11]; 
    int i = 0; 

    printf("Enter a 10 character input for balance: "); 
    if (fgets(input, 10, stdin) != NULL){ 
     for (;i < 10; i++){ 
      /* do what you need here */ 
     } 
    } 
     printf("Goodbye\n"); 
    return 0; 
}