继续在c中的while循环中输入输入。我试过fflush

时间:2015-01-25 05:13:29

标签: c while-loop scanf fflush

我在C中学习数据结构,我需要从用户那里获取输入。我从搜索其他stackoverflow问题中学到了我在打印之后需要使用fflush。

我遇到的问题是当我输入时添加它并不会打印任何内容,直到我通过两次输入退出来打破while循环。有人可以解释如何解决这个问题以及为什么会这样做?

以下是代码:

#include "stdio.h"

typedef struct S_RacingCar {
    char name[8];
    int speed;

} RacingCar;

const int MaxCars = 4;

void PrintList() {
    printf("List Print...\n");
}

int AddCar(RacingCar *car) {
    printf("Enter Name And Speed:\n\n");
    char input[16];
    fgets( input, 15, stdin);
    int ok = 0;

    int result = sscanf(input, "%s %d", car->name, car->speed);

    if (result == 2) {
        ok = 1;
        printf("Added:%s Speed:%d\n\n", car->name, car->speed);
        fflush(stdout);
    } else {
        printf("Sorry, error parsing input\n\n");

    }

    return ok;
}
int main() {

    RacingCar allCars[MaxCars];
    int numCars = 0;

    char command[16];
    char input[16];

    while( fgets(input, 15, stdin) ){

        sscanf(input,"%s",command);

        if ( strncmp(command, "quit", 4) == 0){
            printf("\n\nBreaking...\n");
            break;
        } else if ( strncmp(command, "print", 5) == 0){
            PrintList();
            fflush(stdout);
        } else if ( strncmp(command, "add", 3) == 0){
            if (numCars < MaxCars) {
                numCars += AddCar( &allCars[numCars] );
                fflush(stdout);
            } else {
                printf("Sorry List is Full!!\n\n");
            }

        }
        fflush(stdout);


    }

    return 0;
}

我输入打印后得到的输出,然后添加:

print
List Print...
add

光标在添加下闪烁。如果我进入退出,我得到:

print
List Print...
add
quit
Enter Name And Speed:

Sorry, error parsing input

因此该计划尚未结束,我想知道原因。有人能解释一下吗 要结束程序,我必须再次进入退出:

print
List Print...
add
quit
Enter Name And Speed:

Sorry, error parsing input

quit


Breaking...
<<< Process finished. (Exit code 0)
================ READY ================

2 个答案:

答案 0 :(得分:2)

你的程序表现奇怪的原因是它展示了UB。

更改

int result = sscanf(input, "%s %d", car->name, car->speed);

int result = sscanf(input, "%s %d", car->name, &(car->speed));

这样做是因为sscanf需要int*,但你给它int

另外,您可以添加

setvbuf(stdout, NULL, _IONBF, 0);

main开头,删除程序中的所有fflush()。无论何时写入,上面的行都会刷新stdout

答案 1 :(得分:0)

除了其他答案,请更改:

int AddCar(RacingCar *car) {
  printf("Enter Name And Speed:\n\n");

为:

int AddCar(RacingCar *car) {
  fflush(stdout);
  printf("Enter Name And Speed:\n\n");