以下是我的代码中的代码段。我学会了更好地使用fscanf
代替scanf
。但fscanf并没有等待输入
switch (argc) {
case 2: printf("\nEnter the subject code: ");
while(fgets(temp_op->subject, BUF_NOTES, stdin)==NULL);
case 3: printf("\nEnter the topic: ");
while(fgets(temp_op->topic, BUF_TOPIC, stdin)==NULL);
case 4: printf("\nEnter the Level: ");
flag = fscanf(stdin,"%d",&temp_op->level);
case 5: printf("\nEnter the Answer Key: ");
while(fgets(temp_op->key, BUF_KEY, stdin)==NULL);
case 6: printf("\nEnter any additional notes(optional): ");
while(fgets(temp_op->notes, BUF_NOTES, stdin)==NULL);
break;
default:printf("\nExcess Arguments");
}
问题出在case 5
上。 fgets并没有等待输入,但是案例6表现良好。
但是,如果我注释掉case 4
行“flag = ...”,那么下一个fgets将提示输入。奇怪的。我想知道为什么以前的fscanf影响后者的fgets。我的结构定义是:
typedef struct {
int mode ;
int level;
char subject[BUF_SUBJECT], topic[BUF_TOPIC], notes[BUF_NOTES], key[BUF_KEY];
} operation;
完整来源位于http://pastebin.com/HVvGC3B7
可能出现什么问题?
答案 0 :(得分:5)
您正在将scanf()
与fgets()
混合 - 最好避免。
fscanf(stdin,"%d",...
将\n
留在输入队列中,以下fgets()
消耗而不等待其他输入。
建议使用fgets()
thoguhout并使用sscanf(buffer, "%d", ...
获取整数。
答案 1 :(得分:2)
case 4: printf("\nEnter the Level: ");
flag = fscanf(stdin,"%d",&temp_op->level);
//Here Return key left in buffer
case 5: printf("\nEnter the Answer Key: ");
while(fgets(temp_op->key, BUF_KEY, stdin)==NULL); // escapes because of newline
为避免在getchar();
之前添加case 5
。
或chux建议您也可以使用sscanf()