2010-02-22 123 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