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)。
答案 0 :(得分:1)
从第一个\n
scanf
scanf("%d\n", &input);
\n
在那里做什么?这就是导致scanf
“徘徊”的原因,等待额外的输入,而不是立即终止。
\n
对scanf
具有特殊含义。当您在\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
检索所需数据,而不是传递保留在输入缓冲区中的字符。