【问题标题】:Console failing to take input控制台无法接受输入
【发布时间】:2013-08-29 15:47:26
【问题描述】:

我正在尝试执行一个 c 程序,如果我在其中输入浮点值到一个整数变量,它会按预期跳过小数部分,但之后它不会从控制台读取值。在下面的代码 sn-p 中,它会跳过那个 scanf如果我们输入任何浮点值,则行。我找不到原因。请帮助。

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

#define SIZE 50

void push(int i);
int pop(void);

int *tos, *p1, stack[SIZE];

int main(void)
{
    int value;
    tos = stack; /* tos points to the top of stack */
    p1 = stack; /* initialize p1 */

    do
    {
        printf("\n Enter value: \n");
        scanf("%d", &value);
        printf("\n value entered is %d",value);

        if(value!=0)
            push(value);

        else
            printf("value on top is %d\n", pop());

    } while(value!=-1);

    return 0;
}


void push(int i)
{
    p1++;

    if(p1==(tos+SIZE))
    {
        printf("Stack Overflow.\n");
        exit(1);
    }
    *p1 = i;
}


int pop(void)
{
    if(p1==tos)
    {
        printf("Stack Underflow.\n");
        exit(1);
    }
    p1--;

    return *(p1+1);
}

从控制台输入浮点值时,它会忽略小数部分,然后 do while 继续执行,但 scanf 语句不起作用,因此在执行后直到堆栈填满,然后退出。请帮助找出 scanf 的原因在这里不工作?

【问题讨论】:

  • 检查您的 scanf() 返回值。它将返回 成功 解析的次数。
  • 删除了 C++ 标签,因为代码是纯 C。

标签: c


【解决方案1】:

您要求scanf 读取一个整数值。如果您然后输入例如一个浮点值,然后scanf 将读取第一个数字并在“点”处停止。然后下次您尝试读取输入时,它会看到“点”而不读取任何内容。

你应该检查scanf的返回值,它返回成功读取和转换的项目的数量,所以第一次调用它返回1,但在所有其他调用它返回0

您可以通过将整行读入缓冲区(使用fgets)来解决这个问题,并使用例如sscanf 在缓冲区上。但是您仍然应该检查返回值以了解用户是否输入了有效的整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多