【问题标题】:Scanf input carries over to next scanfscanf 输入结转到下一个 scanf
【发布时间】:2016-10-03 20:50:50
【问题描述】:

我这里有一个代码,它在输入带空格的字符串时会出现一些不需要的行为。例如print illegal_argument。当输入包含多个单词时,我希望它只注册第一个单词。

目前发生的是:

christian@oblig2 $ print 0
Enter router ID for information > ID: 0, flag: f7, model_length: 13, model: D-Link y6000

它注册第一个print 以在命令循环中进行比较。但不是scanf 提示用户输入下一个输入,而是忽略它并从前一个scanf 中获取用户输入的第二个单词/数字。

我想要发生的是:

christian@oblig2 $ print 0
Enter router ID for information > 0
ID: 0, flag: f7, model_length: 13, model: D-link y6000.

一切都按预期工作,但我想知道是否有更简单的方法来做到这一点。我尝试过使用 Strtok,但运气不佳。

char input[256];
printf("%s@oblig2 $ ", getenv("USER"));
scanf("%s", input);

if(strcmp(input, "print") == 0) {
    print();
}

上面的代码是我如何从用户那里得到输入的。

有人有什么想法吗?

【问题讨论】:

  • 当你想要整个输入行时,不要使用scanf,而是使用fgets
  • @OlafDietsche 尝试fgets(input, 256, stdin) 不起作用,除非我做错了什么。尝试$ print 会产生: command not found.
  • @Christian S fgets(input, 256, stdin) 有效。代码中的其他内容也需要更改。见stackoverflow.com/questions/2693776/…

标签: c input scanf


【解决方案1】:

scanf() 获取第一个输入值后,将其余部分留在输入流中。试试这个丢弃剩余的字符:

int ch;
while ((ch = getchar()) != '\n' && ch != EOF)
    continue;             // discard remaining characters

如果您将这些行放在下一次读取 stdin 之前,多余的字符不会破坏您的输入。

【讨论】:

  • 注意:在文件末尾while (getch() != '\n') 是一个无限循环。
  • 真@chux,但是来自终端的一行用户输入总是以'\n'结尾,不是吗?
  • "来自终端的输入总是以 '\n' 结尾," --> 不是总是。该行为是特定于实现的。
  • 好的,@chux-- 编辑了上面的代码来处理这种情况。
  • getch 不是标准函数。你的意思是getc
猜你喜欢
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 2021-12-22
  • 1970-01-01
  • 2017-07-16
相关资源
最近更新 更多