2014-04-20 199 views
3

我是C編程新手。我正在做一個練習,問題如下所示:使用?:運算符和for語句編寫一個程序,用於保存用戶輸入的字符,直到字符q被計入。for循環在C中運行兩次

這裏是我寫的程序:

#include <stdio.h> 

main() 
{ 
    int x, i=0; 
    for (x = 0; x == 'q'? 0 : 1; printf("Loop %d is finished\n",i)) 
    { 
     printf("Enter q to exit!!!\n"); 
     printf("Please enter a character:\n"); 
     x=getc(stdin); 
     putc(x,stdout); 
     ++i; 
    } 
    printf("\nThe for loop is ended. Bye!"); 

    return 0;  
} 

的問題是:每次我進入一個「非Q」字的時候,循環似乎運行兩次。 我不知道我的程序有什麼問題。 請幫忙!

+2

好像你需要清除輸入緩衝區,因爲你正在閱讀換行符,我想。 – zeitue

回答

1

循環運行兩次,因爲當您輸入非q字符時,實際上輸入了兩個字符 - 非q字符和換行'\n'字符。 x = getc(stdin);stdin流讀取非q字符,但換行符仍位於stdin的緩衝區中,該緩衝區在接下來的getc調用中讀取。

您應該使用fgets從其他人建議的流中讀取一行,然後您可以處理該行。此外,您應指定main的返回類型爲int。我建議以下變化 -

#include <stdio.h> 

int main(void) 
{ 
    int x, i = 0; 

    // array to store the input line 
    // assuming that the max length of 
    // the line is 10. +1 is for the 
    // terminating null added by fscanf to 
    // mark the end of the string 
    char line[10 + 1]; 

    for (x = 0; x == 'q'? 0 : 1; printf("Loop %d is finished\n", i)) 
    { 
     printf("Enter q to exit!!!\n"); 
     printf("Please enter a character:\n"); 

     // fgets reads an input line of at most 
     // one less than sizeof line, i.e., 
     // 10 characters from stdin and saves it 
     // in the array line and then adds a 
     // terminating null byte 
     fgets(line, sizeof line, stdin); 

     // assign the first character of line to x 
     x = line[0]; 
     putc(x, stdout); 
     ++i; 
    } 
    printf("\nThe for loop is ended. Bye!"); 

    return 0;  
} 
4

當您輸入一個非q字母時,您還可以點擊輸入,這是在第二個循環中讀取的。

要使循環僅對每個輸入運行一次,請使用fgets()一次讀取整行輸入,並檢查輸入字符串是否符合您的期望。

+0

那你怎麼能讓它只運行一次? – MechAvia

+0

換句話說,'getc(stdin)'有兩個字符可以讀取,而且它是工作的! – ultifinitus

+0

使用'scanf'代替 –

3

當您鍵入a,然後按Enter時,換行符將成爲stdin流的一部分。讀取a後,下次執行x=getc(stdin)時,x的值設置爲\n。這就是循環的兩次迭代得到執行的原因。

1

當你輸入一個字符,說「X」,然後按回車,你居然輸入兩個字符,這是「x」和「\ n」也被稱爲換行(當你回車)。 '\ n'成爲輸入流的一部分,循環也被執行。

另外,嘗試輸入「xyz」並回車,循環將執行4次。對於每個'x','y','z'和'\ n'。

如果您希望代碼爲每個輸入工作一次,請使用函數gets。

#include <stdio.h> 

main() 
{ 
    int i=0; 
    char x[10]; 
    for (; x[0]!='q'; printf("Loop %d is finished\n",i)) 
    { 
     printf("Enter q to exit!!!\n"); 
     printf("Please enter a character:\n"); 
     gets(x); 
     i++; 
    } 
    printf("\nThe for loop is ended. Bye!"); 

    return 0; 
} 

在這段代碼中我們聲明x作爲一個字符串,則得到()函數讀取我們進入整條生產線,然後在for循環的條件部分,我們檢查字符串的第一個字符是「 q'或不。