3

下面给出了我的代码片段。我学会了更好地使用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

有什么问题?

4

2 回答 2

5

scanf()你正在混合fgets()- 最好避免。

fscanf(stdin,"%d",...将 留\n在输入队列中,以下内容fgets()无需等待其他输入即可使用。

建议使用fgets()thoguhout 并使用sscanf(buffer, "%d", ...来获取您的整数。

于 2013-10-09T18:13:02.633 回答
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()

于 2013-10-09T18:19:29.193 回答