我正在从结构数组中的stdin学生那里读书。在为一名学生介绍详细信息后,我会询问另一名学生的详细信息。如果选择是Y,我将添加新学生,如果选择是N,则休息。但如果选择只是ENTER怎么办?如何检测新行字符?我尝试使用getchar(),但它跳过了stdin的第一个读数。当我调试它并没有停止到第一行test = getchar()时,它停止到第二个。
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
struct student
{
char name[20];
int age;
};
int main()
{
struct student NewStud[5];
char test;
int count=0;
for(count=0;count<5;count++)
{
printf("Enter the details for %s student: ",count>0?"another":"a");
printf("\nName : ");
scanf("%s",NewStud[count].name);
printf("\nAge : ");
scanf("%d",&NewStud[count].age);
printf("Would you like to continue? (Y/N)");
test=getchar();
if(test=='\n')
{
printf("Invalid input. Would you like to continue? (Y/N)");
test=getchar();
}
while(tolower(test) !='n' && tolower(test) != 'y')
{
printf("Invalid input.Would you like to continue? (Y/N)");
test=getchar();
}
if(tolower(test) == 'n')
{
break;
}
if(tolower(test) == 'y')
{
continue;
}
}
getch();
}
答案 0 :(得分:2)
问题是scanf()
在输入流中留下换行符,您必须在getchar()
中获得“有效”数据之前使用它。
例如:
scanf("\n%s",NewStud[count].name);
getchar();
printf("\nAge : ");
scanf("%d",&NewStud[count].age);
getchar();
printf("Would you like to continue? (Y/N)");
test=getchar(); // Now this will work
查看此link了解详情。它适用于fgets,但问题与getchar()
答案 1 :(得分:0)
将test
值与'\ n'进行比较,如下例所示:
int main() {
int test;
test = getchar();
printf("[%d]\n", test);
if(test == '\n') printf("Enter pressed.\n");
return(0);
}
ps:您的test
必须为int
。
答案 2 :(得分:0)
当然它会跳过第一个读数,你把它放在if语句中:if(test=='\n')
您获得了该特定学生的所有信息,然后用户按下了输入,因此您返回for(count=0;count<5;count++)
并要求为新学生提供新输入。
我想你想要做的是改用while语句。
答案 3 :(得分:0)
你可以替换
> test=getchar();
> if(test=='\n')
> {
> printf("Invalid input. Would you like to continue? (Y/N)");
> test=getchar();
> }
与
while((test=getchar()) == '\n')
{
printf("Invalid input. Would you like to continue? (Y/N)");
}