Printf语句不按顺序打印

时间:2014-07-29 00:48:08

标签: c

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)。

2 个答案:

答案 0 :(得分:1)

从第一个\n

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

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

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

答案 1 :(得分:1)

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

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

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