丢弃stdin流缓冲区中的无关字符

时间:2014-01-09 11:50:14

标签: c scanf

我想写一个函数来从stdin读取数据。该功能由其他功能调用,以提示用户输入数据。

void read_data(void) {
    // prompt the user by printing a message
    // printf("enter data:\n");

    int a;
    char name[40];
    scanf("%d", &a);

    // prompt for input again

    scanf("%39[^\n]", name);

    // do something with the data
}

为了使函数read_data正常工作,stdin流缓冲区中不应存在任何无关的字符,即它应该为空。该函数不知道在上一次scanf调用中输入了什么,并且输入缓冲区中可能存在整数和字符。

如何确保函数read_data正常工作?

1 个答案:

答案 0 :(得分:1)

void read_data(void) {

 // prompt the user by printing a message
 // printf("enter data:\n");

 int a,c;
 char name[40];
 scanf("%d", &a);
 while((c=getchar()) != '\n');
 // prompt for input again

 scanf("%39[^\n]", name);
 while((c=getchar()) != '\n');
 // do something with the data
}

将第一个scanf与

一起使用
  while((c=getchar()) != ' ' && c != '\t' && c != '\n');

因此,如果给定的字符是'\ n',则getchar函数获取该字符并检查它是否为新行,如果它是新行,如果移动到其他地方它会到达换行符,因此stdin流缓冲区被清除。 / p>