【问题标题】:How to detect in scanf() when there is no input?没有输入时如何在scanf()中检测?
【发布时间】:2019-08-04 09:37:53
【问题描述】:

下面的while循环应该是在没有输入的情况下终止的,怎么实现呢? 还有C++中scanf("%1d" &n)的类似物是什么?

我已经尝试使用返回值scanf() 并使用n==NULL 作为条件,但它们都导致无限循环。

int n;
int arr[100];
int i=0;
int r = scanf("%1d",&n);
while(r==1)
{
    arr[i++]=n;
    r = scanf("%1d",&n);
}

【问题讨论】:

  • “无输入”是什么意思?
  • scanf 不接受 void 输入。要终止 scanf,您必须使用 ctrl-D (Linux/Unix)。这样你得到scanf返回-1。
  • 您已将其标记为 C,但在问题中提到了 C++,它是什么?
  • OP 将其标记为cc++; @πάντα-ῥεῖ 然后删除了其中一个标签。
  • 您可以使用计时器来确定最后一分钟没有输入并发送信号

标签: c input scanf restriction


【解决方案1】:

如果您只想读取一位数字,可以使用 getchar() 来完成。

#include <stdio.h>

int main(void)
{
    int n;
    int arr[100];
    int i = 0;
    int enter = 0;

    while(1)
    {
        n = getchar();

        if (n == 10 && enter) break;

        if (n == 10) 
        {
            enter = 1;
        }
        else
        {
            enter = 0;
            n -= 48;
            arr[i] = n;
            i++;
        }
    }

    return 0;
}

【讨论】:

  • i 超过 99 时,while(1) 应该是“危险的”。
  • 当你真正想到'\n'时,不要使用10。与其他一些数字不同,10 带有作为大多数人类计数的基础的包袱。与48 类似——应该写成'0'(但它没有10 那么多多余的重载含义)。
【解决方案2】:

您可以尝试使用scanf,如下面的代码所示。

代码也验证了:

  • 您插入的元素数量不要超过数组arr (ARRDIM)。

  • 输入不正确的数字(即:'a')不会产生循环。

您必须点击CTRL-D (Linux/Unix) 才能停止数据输入。 (Windows 应使用CTRL-Z 终止)。

#include <stdio.h>

int main(void)
{
#define ARRDIM 100

    int n;
    int arr[ARRDIM];
    int i=0;
    int r=0;

    do
    {
        printf("Insert element %d: ",i+1);
        fflush(stdout);
        r = scanf("%1d",&n);
        if (r>0) {
           arr[i++]=n;
        } else if (!r) {
            printf("Error inserting element: %d ",i+1);
            puts("You have to insert only numbers.");
            // flushes the wrong input
            while ( (r = getchar()) != EOF && r != '\n' );
        }

    }  while(r!=EOF && i<ARRDIM);

    puts("Inserted values:");
    for(r=0;r<i;r++)
        printf("%d\n",arr[r]);

    return 0;
}

注意:此代码不考虑单个输入包含多于 1 个单个数字的情况。如果您在每个输入中插入超过 1 个数字,您将获得加载下一个字段,并且如果您插入的数字多于适合数组中的最大数字数,则重载的数字将保留在标准输入缓冲区中。

【讨论】:

  • 我会选择while (i &lt; ARRDIM &amp;&amp; 1 == scanf(...)) { arr[i++] = ...; }
  • 现在我的代码还控制不正确字符的输入...scanf 可能返回 0。
  • @alk,我喜欢你的代码!但它不能控制由于输入错误数字而导致的错误......正如我所说的那样。
  • @melpomene,我纠正了我的例行程序,现在应该很好了!我认为。 :D
  • while (i &lt; ARRDIM &amp;&amp; 1 == (r = scanf(...))) { arr[i++] = ...; } 在循环后使用r 记录发生的情况:无输入 (0) 或错误输入 (-1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2012-08-15
相关资源
最近更新 更多