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

Ria*_*iaz 1 objective-c

我试图让用户只需按Enter键而不输入任何内容,并使用它来表示接受默认值. scanf没有做我想要的,应用程序仍然"阻止":下一行代码不运行.

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

我尝试使用NSFileHandlefileHandleWithStandardInput ; 然而,似乎用户现在被迫按Ctrl-D来指示EOF.

有人建议使用fgets,但我无法确定传递什么作为第三个参数(FILE*类型).试过stdin,但它没有'阻止'.

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

小智 5

假设代码没有阻塞并且下一行立即运行(正如您似乎在问题的早期和注释中指出的那样),在混合非基于行和基于行的输入时,您会遇到一个常见问题.

会发生什么事情是你在缓冲区中留下了一个换行符,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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,通常并鼓励将ignoreline与scanf(或其他非基于行的输入)"配对",以将其转换为基于行的输入.在这种情况下,您可能想要修改它,这样您就可以区分输入"42 abc"和"42"(在"输入数字"的情况下).有些人只是到处使用fgets,然后使用sscanf解析该行,虽然这有效,但没有必要.