我试图让用户只需按Enter键而不输入任何内容,并使用此表示接受默认值。 scanf 没有按我的意愿行事且应用仍然“阻止”:下一行代码无法运行。
唯一的方法是实际输入内容然后按Enter键。
我尝试使用 NSFileHandle 和 fileHandleWithStandardInput ;但是,似乎用户现在被迫按Ctrl-D来指示 EOF 。
有人建议使用 fgets ,但我无法确定要传递的内容为第3个参数(FILE*
类型)。尝试了 stdin ,但它没有“阻止”。
如何使用Objective-C接受来自用户的输入,同时允许用户只需按Enter键而不必强制输入任何内容?如何读取单行,即使该行为空白?
答案 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
函数...