2014-07-03 102 views
1

這是一個家庭作業問題。我正在參加C語言課程。我現在正在使用的要求是while循環不重複?

「如果輸入空信息,應提示用戶輸入非空信息,直到它們輸入至少1個字符長的信息。」

這是代碼我現在有:

int main(void) 
{ 
char string[101]; 
int menu; 

do 
{ 
    printf("Enter a text message (maximum 100 characters long) : "); 
    scanf(" %100[^\n]s", string); 
} 
while (string[0] == '\0'); 

如果我乘坐空間出在scanf函數行%(前),並且用戶只需點擊進入,電腦會進入一個無限循環,只是在屏幕上打印gook。 (屏幕上的文字移動速度太快,以至於我無法確定,但我認爲它正在不斷打印printf語句。)

隨着空間的存在以及用戶剛敲擊回車,它會移動光標直到用戶輸入一個有效的字符串,然後繼續。

我希望在每次用戶剛輸入時重複這個問題。我試過爲(;;)空,而在這裏你會看到do-while變化。

歡迎任何評論。謝謝。

+1

IDR我的C,但我想你想'!='並且你迫使第一個字母成爲一個空格,所以它永遠不會退出。也許嘗試strlen <2或刪除空間 –

+0

爲了幫助你看到輸出,你可以將它重定向到一個文本文件。 –

+0

@icbytes是一句話嗎? –

回答

1

沒有空間的基本問題是,如果用戶只是點擊輸入,scanf函數會失敗(所以什麼都不會被寫入字符串),和無輸入將被讀取。所以換行符仍然在輸入中,這意味着當你循環時,它會立即再次失敗,給你一個無限循環。

使用空格時,scanf調用將讀取並忽略空白(包括換行符)而不返回,因此當用戶點擊時輸入它保留在scanf中。

最簡單的解決方法就是用fgets:

do { 
    printf("Enter a text message (maximum 100 characters long) : "); 
    if (!fgets(string, sizeof(string), stdin)) { 
     /* error or eof */ 
     exit(1); } 
} while (string[0] == '\n'); 

但這並不忽略上線前導空格和接受只包含空格的行。如果你想要的,你需要這樣的:

char *p; 
do { 
    printf("Enter a text message (maximum 100 characters long) : "); 
    if (!fgets(string, sizeof(string), stdin)) { 
     /* error or eof */ 
     exit(1); } 
    p = string + strspn(string, " \t"); /* skip over leading spaces and tabs */ 
} while (p[0] == '\n' || p[0] == 0); 

之一的scanf的主要限制是,它不是在空格和換行區分好 - 它把既有的空白。

+0

像一個冠軍!當我的check_palindrome()函數停止工作時,我準備將頭髮拉出來,但後來我將結束字符搜索更改爲'\ n'而不是'\ 0',並開始像魅力一樣工作!謝謝 –

1

嗯,我會說最好使用fgets

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

int main(void) 
{ 
    char string[101]; 
    int menu; 

    do 
    { 
     printf("Enter a text message (maximum 100 characters long) : "); 
     fgets(string, 100, stdin); 
    }while (string[0] == '\n'); 

} 

你應該注意到,fgets不要丟棄\n性格和讀取它。當您按輸入\n將存儲在string[0]。因此,您需要檢查string[0] == '\n'

+1

這將再次提示字符串是否爲空,這與OP所要求的相反。 –

+0

@JimLewis;編輯答案。 – haccks

+0

感謝您的反饋意見。這是你對fgets的解釋,而不是放棄幫助完成程序的'\ n'角色。當我轉換爲fgets語句時,我的check_palindrome()函數退出了工作,但我正在將'\ 0'作爲字符串的結尾。 –

3

我建議使用fgets而不是scanf,因爲爲了您的目的,您希望 一次處理一行,並且輸入可能包含嵌入的空白。您應該檢查用戶輸入的換行符並將其去掉(通過替換爲'\0')。然後你的while條件應該按照你想要的方式工作。