Printf语句不按顺序打印

typedef struct node_s{ int data; struct node_s *next; }node_t; void insert(node_t *pointer, int data){ while(pointer->next != NULL){ pointer = pointer->next; } pointer->next = (node_t *)malloc(sizeof(node_t)); pointer = pointer->next; pointer->data = data; printf("Elemnet inserted\n"); //2. Followed by this statment once done. pointer->next = NULL; } int main(){ node_t *start, *temp; start = (node_t *)malloc(sizeof(node_t)); temp = start; temp->next = NULL; printf("1. Insert\n"); printf("2. Delete\n"); printf("3. Print\n"); printf("4. Find\n"); while(1){ int input; scanf("%d\n", &input); if(input==1){ int data; printf("Input data\n");//1. I want this to print out first once I give 1 input. fflush(stdout); scanf("%d", &data); insert(start, data); } } 

当我编译和执行时,我可以给出输入但是printf语句的顺序不是顺序的。 例如,这是我在输入并输入数据后获得输出的方式。

 sh-4.1$ ./linked_list 1. Insert 2. Delete 3. Print 4. Find 1 23 Input data Elemnet inserted 1 45 Input data Elemnet inserted 

我尝试在printf语句之后添加fflush(stdout)。

从第一个scanf删除\n

 scanf("%d\n", &input); 

那是什么?在那里做什么? 这就是导致你的scanf “徘徊”,等待额外输入,而不是立即终止的原因。

那个\nscanf有特殊意义。 当您在scanf格式说明符中使用空格字符(空格,制表符或\n )时,您明确要求scanf跳过所有空格。 如果在scanf格式字符串的最后使用了这样的字符,那么在读取实际数据后, scanf将继续等待输入,直到遇到非空白字符。 这正是你的情况。

除了从scanf语句中删除\n ,请注意scanf将从命令行读取数据,填充指定的变量, 但是它会在输入缓冲区中留下\n从而在下次调用scanf导致问题。 由于没有标准命令来刷新输入缓冲区,因此您有责任确保在下次调用scanf输入缓冲区中没有多余的未使用字符。 在每次scanf之后手动刷新输入缓冲区的一种简单方法,如果只是使用getchar()读取输入缓冲区中的任何剩余字符,直到遇到\n 。 例如:

 int c; ... scanf ("format", &var); do { c = getchar(); while ( c != '\n' ); 

这将确保后续调用scanf检索所需数据,而不是传递保留在输入缓冲区中的字符。