2013-07-12 161 views
0

嘗試通過控制檯創建註冊頁面。 我需要幾個輸入,我使用fgets,所以我需要刷新標準輸入。 堆棧溢出的許多類似問題在這裏重定向:http://c-faq.com/stdio/stdinflush2.html。 我使用該鏈接獲得了下面的代碼。但是,這並不實際工作。它表示用戶名:,然後當我輸入用戶名時,按回車鍵,它會轉到控制檯中一個新的空行,我可以輸入更多的空行。 這是怎麼回事? 我該如何解決它?使用fgets刷新stdin

編輯:添加代碼

NSLog(@"Do you have an account already?(1 for Yes, 0 for no)"); 
    fgets(cnumb1, 2, stdin); 
    int c; 
    while((c = getchar()) != '\n' && c != EOF); 
    size_t length = strlen(cnumb1); 
    if (cnumb1 [length-1] == '\n'){ // In case that the input string has 1 character plus '\n' 
     cnumb1 [length-1] = '\0';} // Plus '\0', the '\n' isn't added and the if condition is false. 
    NSString* string = [NSString stringWithUTF8String: cnumb1]; 
    if (string == 0) { 
     while(numb4 == 1) { 
      numb3 = 1; 
      while(numb3 == 1){ 
       NSLog(@"Username:"); 
       fgets(usercheck1, 13, stdin); 
       int c2; 
       while((c2 = getchar()) != '\n' && c2 != EOF); 
       size_t length1 = strlen(usercheck1); 
       if (usercheck1 [length1-1] == '\n'){ // In case that the input string has 12 characters plus '\n' 
        usercheck1 [length1-1] = '\0';} // Plus '\0', the '\n' isn't added and the if condition is false. 
+0

如果你使用fgets,你可以忘記標準輸入緩衝區,你不必清理它。 –

+0

通常是的,但只有當用戶輸入的字符少於緩衝區可容納的字符時。 – onitake

+0

@onitake有一次我問了這個問題後,我發現usercheck1(實際上並沒有在這段代碼中被定義)應該被定義爲char usercheck1 [大任意數] –

回答

0

完全重寫我的答案,貌似我不明白的問題不夠好。

應該清空輸入緩衝區的行不會得到任何東西,直到用戶再次按下回車鍵 - 除非用戶輸入的字符多於輸入緩衝區可容納的字符。

您應該首先檢查fgets讀取的字符串的長度,如果最後一個字符(在\0之前)是\n,則不要嘗試讀取更多字符。否則像你一樣清空輸入緩衝區。

+0

不管有多少回報,它都不會做任何事情,除了移動閃爍|光標的事情下另一行。這一點的意義在於它應該清除標準輸入。我需要這個,因爲如果我不這樣做,下一個fgets只是反覆使用第一個輸入,而我只能有一個輸入。 –

+0

我明白了。然而,如果你試圖這樣做,那麼你將會遇到一個衝突問題,因爲shell將等待下一個換行符,直到它給出任何字符。看起來有點奇怪,你需要清除輸入緩衝區。 'fgets'不應該給你以前讀過的任何東西。 – onitake

+0

我讓它通過userInput4進行搜索,如果它在那裏找到任何空格,它就會NSLogs它。如果我輸入「a」,爲什麼會出現這種錯誤? –