如何在控制台应用程序中不使用scanf来获取用户输入?

时间:2010-02-22 15:19:39

标签: objective-c

我试图让用户只需按Enter键而不输入任何内容,并使用此表示接受默认值。 scanf 没有按我的意愿行事且应用仍然“阻止”:下一行代码无法运行

唯一的方法是实际输入内容然后按Enter键。

我尝试使用 NSFileHandle fileHandleWithStandardInput ;但是,似乎用户现在被迫按Ctrl-D来指示 EOF

有人建议使用 fgets ,但我无法确定要传递的内容为第3个参数(FILE*类型)。尝试了 stdin ,但它没有“阻止”。

如何使用Objective-C接受来自用户的输入,同时允许用户只需按Enter键而不必强制输入任何内容?如何读取单行,即使该行为空白?

4 个答案:

答案 0 :(得分: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解析该行,虽然这样做有效,但没有必要。

答案 1 :(得分:3)

我在库getch();中使用conio.h 只需程序等待按下任何键

答案 2 :(得分: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

然后你不需要在每个键之后按Enter键。这对我来说就像一个梦想......

答案 3 :(得分:1)

使用getchar()进行输入而不使用scanf函数...