【问题标题】:Requiring scanf to recognise no input要求 scanf 识别无输入
【发布时间】:2013-12-09 16:54:14
【问题描述】:

我对 C 编程非常陌生,我正在寻找最简单的解决方案来让 scanf 识别没有输入,我的意思是在没有输入任何内容的情况下按下 enter 键并且它知道没有输入任何内容并返回到主菜单。我看了看这里,我发现了一个类似的问题,但 scanf 采用的是整数值,而我需要一个字符串作为文件名。我的代码是:

    FILE *Fpacket;
    char filename[20];

    puts("Please declare a name for the file");   // request filename  
    scanf("%s", filename);    // store text in filename string

我尝试了 fgets、getchar 和其他一些组合,但我无法将换行符作为输入。我知道 scanf 会忽略前面的空格,非常感谢任何帮助!

谢谢

【问题讨论】:

  • scanf 会返回读取的字符数,可以放一个 a=scanf();和 if(a==0) 应该可以工作
  • @fernando.reyes 感谢您的回复,但是这段代码仍然没有将回车键作为输入,它只是进入终端的下一行
  • @user3043146 建议一段时间(几小时、几天)后,在满足您需求的答案中,接受最好的答案。 (一旦你达到 15+ 代表),对所有对你有用的答案进行投票。

标签: c newline scanf


【解决方案1】:

scanf("%s", filename) 中使用%s 没有解决方案,因为格式说明符在尝试填充filename 之前会消耗空格,包括\nscanf() 在出现非空白(或 EOF 或 IO 错误)之前不会返回。

更好用fgets()/sscanf()

char buf[MAXPATH + 2];
if (fgets(buf, sizeof buf, stdin) == NULL) handle_EOF_IOError();
if (buf[0] == '\n')
  handle_OnlyEnterKeyPressed();
else 
  sscanf(buf, "%s", filename);

【讨论】:

  • @Floris fgets()/sscanf() 成语虽然有点尴尬,但比有问题的scanf() 强大得多,我想知道为什么不直接教授它?和你一样,在地球上也有类似的任期,我​​完全避开了scanf()
  • 这对我来说也是个谜。也许 C 被认为是一种“入门”语言,应尽快放弃,成为一种“真正的”语言……所以不需要学习任何实用的东西——让我们把它们与指针混淆,然后继续前进。到Java? C#?不确定“选择的语言”是什么。我发现 C 语言的简单性很强大。
  • @chux 我已经在我的程序中实现了这段代码,当我调用我的保存文件函数时,它似乎跳转到我处理按下回车键而不等待任何输入的位置,可以“\n”值仍然在我的菜单选择的输入缓冲区中?
  • @user3043146 我怀疑你在前面的代码中有一个scanf()scanf() 很可能将前面的 留在了 stdin 中。最好不要将scanf()fgets() 混合使用。在整个代码中使用其中一种。建议避开scanf()。接下来是另一个想法......
  • @user3043146 一个常见的习惯用法是在提示输入新输入之前消耗所有用户输入。这种方法对学习者来说是有问题的。所以我放弃了展示它。 - 对不起。相反,fgets(buf, , stdin) 最容易用于 all user 输入和sscanf(buf, ...)
【解决方案2】:

如果你想从键盘输入一个换行符(回车)作为输入,那么你需要使用另一个键来终止字符串 //按 Esc 终止字符串。

int main() {
char filename[20];
char ch;
int i;
i=0;
while ((filename[i] = std::cin.get()) != 27 && i<20) {
i++;
}
return 0;
}

如果你按下键盘上的回车键,它将把它作为字符存储在文件名[i]中,while循环永远不会终止,直到你按下Esc或i

【讨论】:

  • 当问题是关于 C 的时候,你为什么要使用 iostreams?
  • @SantanuXCowBoy 这是一个关于 C 的问题 - 请注意问题底部的 C 标签。您的帖子使用 std::cin.get() 需要另一种语言 (C++)。祝你以后的帖子好运。
猜你喜欢
  • 2019-02-23
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 2012-11-02
  • 2014-12-11
  • 2023-03-24
  • 2020-06-04
相关资源
最近更新 更多