我正在尝试执行ac程序,其中如果我输入一个整数变量的浮点值,它会按预期跳过小数部分,但之后它不会从控制台读取值。在下面的代码片段中,它会跳过该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);
}
从控制台输入一个浮点值时,它忽略了小数部分,然后继续执行但是scanf语句不起作用,所以在执行它之后直到堆栈填充,然后它退出。请帮助找到为什么scanf这不起作用吗?
答案 0 :(得分:4)
您要求scanf
读取整数值。如果您然后输入例如一个浮点值,然后scanf
将读取第一个数字并在“点”停止。然后,当您下次尝试读取输入时,它将看到“点”而不读取任何内容。
你应该检查scanf
的返回值,它返回成功读取和转换的项目的数量,因此对于第一次调用,它返回1
但是在所有其他调用中它返回0
}。
您可以通过将整行读入缓冲区(使用fgets
)来解决此问题,并使用例如缓冲区上的sscanf
。但您仍应检查返回值以了解用户是否输入了有效整数。