【问题标题】:how can I ignore scanf() at certain characters?如何在某些字符处忽略 scanf()?
【发布时间】:2021-11-19 22:36:58
【问题描述】:

如果某个字符被扫描,是否可以在while 循环中忽略scanf()

例如:

int i = 0;
char b = 32;

while (scanf("%c", &b) == 1) {
    if (b == '\n') {
        printf("r");
    } 
    i++;  
}

按回车后输出:“r”。 按空格+输入后输出:“r”。但在这里我希望没有输出! 我只想在按下回车时输出,之前什么都没有!

【问题讨论】:

  • 欢迎来到 Stack Overflow。 if 语句永远不会被“忽略”。发生的情况是,当您期望它为假时,该条件为真,反之亦然 - 可能是因为相关的周围代码(在这种情况下,很可能是 scanf 操作本身)没有达到您的预期。请阅读ericlippert.com/2014/03/05/how-to-debug-small-programs,然后针对具体输入,确切您认为应该发生什么确切给出一个清晰的解释,以及为什么即使在尝试一步一步地遵循代码逻辑之后你也会感到困惑。
  • 如果问题是您了解出了什么问题但不知道如何编写实现所需逻辑的代码,您仍然需要详细解释特定输入应该发生什么,并清楚地陈述逻辑。另外,试着拿出一支真正的铅笔和一张纸,画一张流程图。它确实有效。
  • 感谢您的回答!我编辑了这个问题,希望它现在清楚我的意思。
  • 如果您确实在阅读交互式输入,那么您将需要适应偶尔由 enter 按键生成的换行符。你当然可以忽略这些。但是,如果输入还包含您希望以不同方式处理的换行符,那么您需要某种方式来区分这两种类型,否则您的输入格式不适合交互式使用。
  • 我真的需要忽略除输入之外的所有内容,其他任何内容都应该忽略!

标签: c scanf


【解决方案1】:

您可以使用标志来指示换行符之前是否有其他字符。比如:

char b = 32;
int flag = 1;

while (scanf("%c", &b) == 1) 
{
    if (b == 'q') break;  // End program when q is pressed

    if (b == '\n') 
    {
        // Only print if the flag is still 1
        if (flag == 1)
        {
            printf("r");
        }

        // Set the flag to 1 as a newline starts
        flag = 1;
    }
    else
    {
        // Other characters found, set flag to 0
        flag = 0;
    }
}

对于像这样的输入

\n   // newline will print an r
 \n  // space + newline will not print anything
a\n  // a + newline will not print anything

一般而言,只有当输入是换行符没有任何前面的字符时,此代码才会打印。

【讨论】:

  • 非常感谢!
  • 可能适合使用bool 而不是int 作为flag 的数据类型。请注意,这需要#include <stdbool.h>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多