2017-10-16 77 views
0

我需要能夠檢測到無關的輸入並退出我的程序。scanf只有一個字符

如果我在scanf("%c", &var);中輸入一個多於一個字符的字符串,它會取第一個字母並將其存儲到var中,但程序會繼續。

我試着用if (scanf("%c", &var) != 1),但是它每次都返回1,不管輸入那麼它沒什麼區別。我知道像fgets()這樣的其他函數可能更適合這個,但我被指示使用scanf()函數。

我該怎麼做?

+2

'如果(scanf函數( 「%C%C」,與VAR,及額外的)== 2 &&額外的!= '\ n')' – BLUEPIXY

+4

注意,你通常要至少經過一個換行符輸入的字符通常更多(除非字符是換行符)。你需要決定並解釋你想要做更準確的事情。以前輸入了什麼?角色後面輸入了什麼?你確定你應該擔心嗎? (最後一個答案可能是'是',但你需要小心你允許和禁止的內容。) –

+1

還要注意,一般情況下,你不應該用C和C++標記問題。選擇你正在學習的語言,不要用另一個標記問題。 –

回答

-1

如果你只是不想你的程序等待鍵入 「CONIO.H」

c = getch(); 

OR

在scanf(「%定義的字符,使用的getch()後進入c「,& var);您可以在%c之後添加換行符\ n以吸收多餘的字符。

scanf("%c\n",&in); 
+0

'getch()'不是**標準函數。它在MS-DOS'conio.h'和Unix nCurses庫中有兩個不同的版本。 – iBug

+0

是的,主要目標是解決這個問題,我給了我兩種方法。我沒有看到這個問題! @iBug –

0

當讀取用戶輸入時,scanf可以從文件或控制檯獲取其輸入。

從控制檯讀取數據時,只有在添加換行符時數據纔可用於程序。這意味着任何在同一行輸入的內容都被讀取。

想象我有一個迷宮程序,並要我選擇哪個方向走....

while(!atGoalLocation()) { 
    printf("Which direction (f)orward (l)eft (r)ight?\n"); 
    scanf("%c", &dir); 
    processDirection(dir); 
} 

我既可以通過迷宮進入路線爲

f 
l 
f 
r 
f 
f 

或者它也可能是正確的,進入我的輸入作爲

flfrff 

根據您的任務,他們可能意味着同樣的事情。

如果您想要允許這些輸入中的任何一個,請確保通過向scanf添加「」來吃掉空白區域。

if(scanf(" %c", &dir) == 1) 

如果斷行版本是要接受的唯一方法,那麼你應該分開的線,然後嘗試進行掃描。

char line[200]; 
while(fgets(line, sizeof(line), stdin) != NULL){ 
     sscanf(line, "%c", &dir); 

也爲C++,我們應該使用std::cinstd::cout。然而,同一行上的未讀字符會出現同樣的複雜情況,所以我仍然會使用基於行的解析器。

std::string line; 
while(std::getline(std::cin, line)){ 
    // here we could parse the line using std::strstream to decode more complext things than a char. 
    dir = line[0]; 
相關問題