【问题标题】:How to ignore an empty line from the keyboard in C如何在C中忽略键盘上的空行
【发布时间】:2016-02-23 07:15:46
【问题描述】:

我正在努力解决 C 从键盘输入数据中看似微不足道的问题,但我是 C 菜鸟(不过有一些 Java 背景)

我需要什么:我需要从键盘输入一个 int 值(然后按 Enter),然后我需要用户只按 Enter 而不输入任何内容,然后输入另一个 int(再按一次 Enter)。

我能做什么

int a = 0;
int b = 0;
scanf("%d", &a);
skip_line_cool_function();
scanf("%d", &b);
printf("You have just entered: &d and &d", a, b);

如你所见,我不知道如何跳线。

我尝试过的方法scanf 输入了一个虚拟 C 字符串,但是,如您所知,当您什么都不输入时,它会耐心等待至少有什么东西出现输入。

我在 Google 上搜索的内容:我怀疑 fgets 可以完成这项工作,但老实说,我不明白如何在我的案例中使用它。

【问题讨论】:

  • 如果你想控制线路,不要使用scanf();使用fgets()sscanf()。如果您使用scanf(),它将允许用户在数字前输入任意数量的空格,包括换行符。你可以把你的函数写成void skip_line_cool_function(int n) { int c; int i = 0; while ((c = getchar()) != EOF && i < n) { if (c == '\n') i++; } }。您可以将其称为skip_line_cool_function(2); 以跳过两个换行符——第一个数字之后的一个,以及空白行的一个。 UI 听起来不是很悦耳;强迫人们输入空行有点问题。
  • 非常感谢 :) 其实那不是 UI,我不想讲太多细节,这是一个 UVa Online Judge 问题输入要求(准确地说是 793)。我在 Java 中做到了这一点,看起来或多或少很简单,现在我正在努力提高我的 C/C++ 技能,因为我以后会需要它们。

标签: c


【解决方案1】:
/* Read first integer */
do {
  if(!fgets(buffer, sizeof buffer, stdin)) break;
} while( last_character_of(buffer) != '\n');
/* Read next integer */

【讨论】:

  • 这个do{...} while 跳过了一行skip_line_cool_function()。如果中间需要一条线,则需要 2 次。
【解决方案2】:

如果您对用户只会按一次输入的 UI 这么严格,那为什么不这样做呢?

int a = 0;
int b = 0;
scanf("%d", &a);
getchar(); /* this will get the enter pressed after entering a */
getchar(); /* this will get the enter for the blank line */
scanf("%d", &b);
printf("You have just entered: &d and &b", a, b);

您发布的代码 sn-p 也会导致编译错误。 printf() 需要整数格式说明符 %d 才能正常工作。使用这个:

printf("You have just entered: %d and %d", a, b);

【讨论】:

  • 你说的太对了,谢谢,我编辑了!并感谢您的想法!
猜你喜欢
  • 1970-01-01
  • 2020-02-27
  • 2011-04-24
  • 1970-01-01
  • 2018-05-27
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多