【问题标题】:The scanf function is accepting values infinatelyscanf 函数无限地接受值
【发布时间】:2015-03-28 19:51:23
【问题描述】:

int n;
int a[maxsize];
int b[maxsize];
int c[maxsize];
int i;
printf("enter number of  elements(disks)\n");
scanf("%d",&n);
printf("enter the elements in ascending  order\n");
for(i=0;i<n;i++)
{   
    scanf("%d",&a[i]);
}

这有时可以正常工作,但大多数时候这段代码会进入无限循环,循环中的“scanf”无限地接受值,我尝试使用函数 (fflush) 来清除缓冲区内容,但它仍然无法正常工作,请有人帮帮我!请解释原因!!

【问题讨论】:

  • “这有时很好,但大多数时候”嗯..这可能取决于你的电脑心情..对!
  • 什么时候失败?当第一个输入不是十进制数时?您应该通过测试来自scanf 的返回值来检查。
  • @JerryGoyal 是输入可以实现这一点。
  • @iharob 我的意思是操作应该指定导致问题的“输入”
  • Mothi Mohammed 能否提供一个使代码进入无限循环的输入示例?

标签: c scanf infinite-loop


【解决方案1】:

发布的代码无法进入无限循环,scanf() 函数可能会阻塞,直到您输入诸如 Ctrl+D 之类的内容来结束输入流或可能是另一个整数,问题是因为您根本没有检查错误,因此您正在以非常危险的方式处理输入,可能会做您真正想要的事情

#include <stdio.h>
#include <stdlib.h>

#define clearstdin() do {int chr; while (((chr = getchar()) != EOF) && (chr != '\n')); } while (0)
#define SOMELARGESIZE 1024

int main(void)
{
    unsigned int index;
    unsigned int size;
    int          result;

    fprintf(stderr, "input the desired array size: ");
    while (((result = scanf("%u", &size)) != 1) && (result != EOF))
     {
        fprintf(stderr, "invalid input, try again\n");
        clearstdin();
     }
    if (result == EOF)
     {
        fprintf(stderr, "EOF recieved, ending the program\n");
        return -1;
     }
    if (size < SOMELARGESIZE)
     {
        int array[size];

        for (index = 0 ; index < size ; index++)
         {
            fprintf(stderr, "input an integer: ");
            if (((result = scanf("%d", &array[index])) == 1) && (result != EOF))
                fprintf(stdout, "\tarray[%d] = %d\n", index, array[index]);
            else if (result == EOF)
             {
                fprintf(stderr, "EOF recieved, ending the program\n");
                return -1;
             }
            else
             {
                fprintf(stderr, "invalid input, try again\n");
                index -= 1;
             }
            clearstdin();
         }
     }
    else
     {
        fprintf(stderr, "sorry, you requested a very large array\n");
        return -1;
     }
    return 0;
}

上面程序的唯一问题是,如果您在scanf() 等待输入时输入任何空白字符,它将什么也不做,直到输入有效或无效输入,特别是非空白输入。

【讨论】:

  • 是的。但这里不相关。 %d 可以跳过任意数量的空格。
  • OP 正在输入整数
  • 这也不会导致无限循环。
  • ((result = scanf("%d", &amp;array[index])) == 1) &amp;&amp; (result != EOF) 很奇怪。如果前半部分为真,那么后半部分也为真。如果前半部分为假,则不评估后半部分。简单建议(result = scanf("%d", &amp;array[index])) == 1
【解决方案2】:

scanf 将返回成功扫描的项目数。
如果 scanf 不返回 1,则读取一个字符,然后 scanf 再次尝试。
scanf ( "%*[^0-9\n]"); 将读取并丢弃任何不是数字或换行符的字符。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SIZE 10

int main()
{
    int i;
    int n;
    int a[SIZE];
    printf("enter number of elements(disks) 0-%d\n", SIZE - 1);
    while ( scanf("%d",&n) != 1 || n >= SIZE) {
        scanf ( "%*[^0-9\n]");
        printf ( "problem with input, try again\n");
    }
    printf("number was %d\n", n);
    printf("enter the elements in ascending  order\n");
    for(i=0;i<n;i++)
    {
        while ( scanf("%d",&a[i]) != 1) {
            scanf ( "%*[^-0-9\n]");//[^-0-9\n] characters NOT digit, newline or minus
            printf ( "problem with input, try again\n");
        }
        printf("number for a[%d] was %d\n", i, a[i]);
    }
    return 0;
}

【讨论】:

  • 只有一件事困扰我,你不检查n &lt; sizeof(a) / sizeof(a[0]) 这会导致未定义的行为,其余的真的很好,+1。此外,通知用户输入无效,再次询问输入会令人困惑。
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 2013-02-23
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多