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

Continue taking input in while loop in c. I've tried fflush

我正在学习 C 语言的数据结构,我需要听取用户的意见。我通过搜索其他 Whosebug 问题了解到,我在打印某些内容后需要使用 fflush。

我遇到的问题是,当我键入 add 时,它不会打印任何内容,直到我通过输入 quit 两次来中断 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 然后添加后得到的输出是:

print
List Print...
add

add下光标一直在闪烁。如果我输入 quit 我得到:

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

Sorry, error parsing input

所以节目还没有结束,我想知道为什么。有人可以解释吗? 要结束程序我必须再次输入 quit:

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

Sorry, error parsing input

quit


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

你的程序行为怪异的原因是它表现出 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

除其他答案外,更改:

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

至:

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