为什么第一个get()函数不起作用?

时间:2016-01-15 08:56:13

标签: c function

此处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;
}

2 个答案:

答案 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()容易出现缓冲区溢出。