2010-02-22 126 views
1

我試圖讓用戶只需按Enter就可以不輸入任何內容,並用它來表示接受默認值。 scanf沒有按照我的要求做,我的應用程序仍然'阻止':下一行代碼不運行如何在控制檯應用程序中使用scanf而不使用scanf?

唯一的方法是實際輸入東西,然後按Enter鍵。

我嘗試使用NSFileHandlefileHandleWithStandardInput;然而,似乎用戶現在被迫按Ctrl-D來指示EOF

有人建議使用fgets,但我不能找出通過第三個參數(FILE*類型)的內容。嘗試stdin但它不'阻止'。

如何接受來自用戶的輸入,使用Objective-C,並且同時允許用戶在不被強制鍵入任何內容的情況下直接按Enter鍵?如何閱讀單行,即使該行是空白的?

+0

這個問題是非常明確的,我認爲它可以保持原樣。 – extraneon 2010-02-22 15:27:01

+0

我確實同意它更清楚。 – 2010-02-22 15:28:26

+0

你*可能*編輯這個更清晰的「我如何正確地調用fgets與stdin來做X」,**包含一個測試用例**(或至少是示例代碼)等。 – 2010-02-22 15:33:03

回答

5

假設代碼塊和下一行運行立即(如你似乎在這個問題早在a comment表示),你攪拌時有一個共同的問題,非線爲基礎,線基於輸入。

會發生什麼事是你必須留在緩衝區換行,並與fgets看到的是,讀取它,並返回,而不是做你真正想要的:忽略它,然後讀線。

的解決方案是簡單地做自己的忽略的部分,然後調用與fgets:

#include <stdio.h> 
#include <string.h> 

FILE* ignoreline(FILE* stream) { 
    for (int c; (c = fgetc(stream)) != EOF;) { 
    if (c == '\n') break; 
    } 
    return stream; 
} 

void example_use() { 
    char buf[1000]; 
    ignoreline(stdin); 
    fgets(buf, sizeof buf, stdin); 
    // or, since it returns the stream, can be more compact: 
    fgets(buf, sizeof buf, ignoreline(stdin)); 
} 

int main() { // error handling omitted 
    int n; 
    printf("Enter a number: "); 
    scanf("%d", &n); 

    char buf[1000]; 
    printf("Enter a line: "); 
    ignoreline(stdin); // comment this line and compare the difference 
    fgets(buf, sizeof buf, stdin); 
    *strchr(buf, '\n') = '\0'; 
    printf("You entered '%s'.\n", buf); 

    return 0; 
} 

注意,這也是常見的,並鼓勵他們「配對」的ignoreline與scanf函數(或其他非線基於輸入)將其轉化爲基於行的輸入。在這種情況下,您可能需要對其進行修改,以便您可以分辨輸入「42 abc」和「42」(在「輸入數字」情況下)之間的區別。有些人只是在任何地方都使用fgets,然後用sscanf解析該行,並且這可以工作,但沒有必要。

+0

Gotcha - 感謝您的幫助 - 我試着做一個新項目,並在* main *中查找stdin/fgets的測試代碼,並且它阻止了罰款。 – Riaz 2010-02-22 15:49:21

+0

@Riaz:FWIW,雖然我感到你的沮喪,但如果這回答你的問題,那麼你的問題就是關於C.我在這裏只使用了標準C,並且從未在我的生活中編碼過Obj-C。 :) – 2010-02-22 15:53:22

+0

如果我沒有提供測試用例,而我的示例沒有完全完整並且沒有工作(這很容易做,所以我現在擁有),那麼我可以誇獎你是不公平的,但這就是生活。 – 2010-02-22 16:05:09

1

如果你使用的是Windows,你可以使用ReadConsoleInput功能(參見MSDN以獲得更多關於此):

INPUT_RECORD keyin; 
DWORD r; 

    while (ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),&keyin,1,&r)) { 

    if (keyin.EventType!=KEY_EVENT) continue; 
    if (keyin.Event.KeyEvent.wVirtualKeyCode==VK_SPACE) break; ///use these VK codes to get any key's input 

    if (keyin.Event.KeyEvent.wVirtualKeyCode==VK_F1)    
    { 
     printf("You pressed F1\n"); 
    } 

    if (keyin.Event.KeyEvent.wVirtualKeyCode==VK_F2)    
    { 
     printf("You pressed F2\n",); 
    } 

    }//end while loop 

你並不需要點擊進入每個鍵then.This就像一個後是我的夢想......

3

我在圖書館使用getch();conio.h 簡單程序等待任何鍵被按下

1

使用getchar()採取輸入而不使用scanf FUNC和...

+0

爲了提高您的文章的質量,請包括您的答案將如何/爲什麼會解決問題。 – 2012-10-03 00:33:45