检测换行符

时间:2012-09-17 18:17:33

标签: c

我正在从结构数组中的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();
}

4 个答案:

答案 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)");
}