fscanf for stdin没有提示输入

时间:2013-10-09 18:07:41

标签: c pointers struct fgets scanf

以下是我的代码中的代码段。我学会了更好地使用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

可能出现什么问题?

2 个答案:

答案 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()