我试图让用户只需按Enter键而不输入任何内容,并使用它来表示接受默认值. scanf没有做我想要的,应用程序仍然"阻止":下一行代码不运行.
唯一的方法是实际输入内容然后按Enter键.
我尝试使用NSFileHandle和fileHandleWithStandardInput ; 然而,似乎用户现在被迫按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解析该行,虽然这有效,但没有必要.
| 归档时间: |
|
| 查看次数: |
10085 次 |
| 最近记录: |