此处gets()
首先无效。如果我再添加一个gets()
函数,那么从最后一个函数开始工作。我该如何解决?
CODE
#include<stdio.h>
#include<string.h>
int main(void)
{
short int choice;
char number[15];
do{
printf("\n\nAnswer: ");
scanf("%hd",&choice);
printf("\n");
if(choice==1)
{
printf("Enter the decimal number: ");
gets(number);
}
else
{
printf("Wrong input!.");
system("pause");
system("cls");
}
}while(choice!=1);
return 0;
}
答案 0 :(得分:0)
因为当用户按下回车键为您提供scanf
调用的输入时,回车键在输入缓冲区中添加了换行符。 gets
调用将该换行读为空行。
解决此问题的一种方法是使用fgets
来读取第一个输入,并使用sscanf
将其解析为数字:
...
printf("\n\nAnswer: ");
char input[64];
fgets(input, sizeof(input), stdin);
sscanf(input, "%hd", &choice);
printf("\n");
...
这样可以确保读取并跳过输入后的换行符。
另一种方法是在scanf
调用后在循环中一次读取一个字符,直到您阅读换行符为止:
scanf("%hd", &choice);
int ch;
while ((ch = fgetc(stdin)) != EOF && ch != '\n')
{
// Empty
}
第三种方法是在输入后简单地要求scanf
调用读取并忽略空格:
scanf("%hd ", &choice);
// ^
// |
// Note space here
所有这些方法都有利弊。您可以尝试所有这些并使用适合您的那个。
答案 1 :(得分:0)
您需要在输入缓冲区中的数字后面跳过空格(即换行符)。这可以通过将scanf修改为:
来完成scanf("%hd ",&choice);
并使用fgets(),因为gets()容易出现缓冲区溢出。