GCC中gets()/fges()读入输入的问题解决 -- 清理stdin缓存

这几天一直被一个bug折磨,最终发现是stdin缓存了‘\n’,因此fgets()函数无法正常执行,解决的方法是在调用fgets()之前将缓存清空。VC中可以使用fflush(stdin)的方法,但在gcc中,fflush(stdin)的作用并不是清空stdin缓存,因此需要我们手动来做,代码如下:

代码说明:

这段代码的目的是读入矩阵的行、列数,然后让用户一次性输入整个矩阵。问题出在get_row_col()函数中的scanf上,解决方式是在fgets中加入清除缓存的循环。

#include #include #include #define BUFFSPACE 4 #define BUFFSIZE 4096 void get_row_col(int*, int*); void print_matrix(int*, int , int); int check_input(int*, int); int main(int ac, char*av[]){ int count, row_num, col_num; int *matrix; char *buff, *char_input; get_row_col(&row_num, &col_num); matrix = (int*)malloc(sizeof(int)*row_num*col_num); buff = (char*)malloc(sizeof(char)*row_num*col_num*BUFFSPACE); printf("please input your matrix\n"); char c; //清除stdin中的缓存 while ( (c = getchar()) != '\n' && c != EOF ) ; if( fgets(buff, BUFFSIZE, stdin) == NULL ) printf("An error occurs when reading user input\n"); int num_input = 0; count = 0; char_input = strtok(buff, " "); while( char_input != NULL ){ num_input = atoi(char_input); matrix[count] = num_input; if( check_input(matrix, num_input) == -1) ;//to be done count++; char_input = strtok(NULL, " "); } if( count != (row_num*col_num) ){ printf("your input did not conform to your declared matrix, please run this program again\n"); exit(1); }else{ print_matrix(matrix, row_num, col_num); } free(matrix); free(buff); return 0; } void get_row_col(int *row_num, int *col_num){ printf("Please input the number of rows\n"); scanf("%d", row_num); printf("Please input the number of cols\n"); scanf("%d", col_num); //问题在这里,用户回车时输入了一个'\n',但scanf并没有将其从缓存中读出,从而使其留在了缓存中 } void print_matrix(int *matrix, int row_num, int col_num){ int i, j; int k = 0; printf("Your %d * %d matrix is: \n", row_num, col_num); for(i=0; i


你可能感兴趣的:(GCC中gets()/fges()读入输入的问题解决 -- 清理stdin缓存)