我在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 ================
答案 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");