在 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");
我正在学习 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");