无限循环 Do While
Infinite loop Do While
我正在尝试创建一个程序,在开始时它向用户显示一个菜单,其中包含一个 do{ ... }while;它读取一个 int.,里面有一个开关。
它完美地读取和检查整数,问题是在写入字符或字符串时,它会陷入无限循环,显示 switch 循环的默认消息。代码如下:
int op;
printf("Choose an option:\n 1. option 1\n 2. option 2\n 3. option 3\n");
do{
scanf("%d", &op);
switch(op){
case 1: (instruction); break;
case 2: (instruction); break;
case 3: (instruction); break;
default: printf("\nPlease enter a valid option\n");
}
}while(op<1 || op>3);
It works perfectly to read and check the integer, the problem is when writing a character or string, which gets stuck in an infinite loop showing the default message of the switch loop.
scanf("%d", &op);
当输入不是有效的 int 时什么都不做,你需要检查 return 值是否为 1,如果不是,则决定要做什么,例如读取字符串或刷新直到行尾,还管理 EOF 案例
注意以防 scanf
什么都不做 op 未设置
也可以:
int op;
printf("Choose an option:\n 1. option 1\n 2. option 2\n 3. option 3\n");
do{
if (scanf("%d", &op) != 1) {
// flush all the line
while ((op = getchar()) != '\n') {
if (c == EOF) {
puts("EOF, abort");
exit(0); /* what you want */
}
}
op = -1; /* invalid value */
}
switch(op){
case 1: (instruction); break;
case 2: (instruction); break;
case 3: (instruction); break;
default: puts("\nPlease enter a valid option");
}
}
}while(op<1 || op>3);
我鼓励你从不相信一个输入并且总是检查return值scanf
等等
%d
转换说明符仅查找十进制输入。消耗字符或字符串不起作用。如果你输入一个字符而不是一个十进制值,该指令将失败,并且因为 op
没有初始化你有 undefined behavior.
要使用 scanf()
捕获字符串,请使用 %s
转换说明符或使用 fgets()
。对于只捕获一个字符,请使用 %c
转换说明符和 scanf()
.
我正在尝试创建一个程序,在开始时它向用户显示一个菜单,其中包含一个 do{ ... }while;它读取一个 int.,里面有一个开关。
它完美地读取和检查整数,问题是在写入字符或字符串时,它会陷入无限循环,显示 switch 循环的默认消息。代码如下:
int op;
printf("Choose an option:\n 1. option 1\n 2. option 2\n 3. option 3\n");
do{
scanf("%d", &op);
switch(op){
case 1: (instruction); break;
case 2: (instruction); break;
case 3: (instruction); break;
default: printf("\nPlease enter a valid option\n");
}
}while(op<1 || op>3);
It works perfectly to read and check the integer, the problem is when writing a character or string, which gets stuck in an infinite loop showing the default message of the switch loop.
scanf("%d", &op);
当输入不是有效的 int 时什么都不做,你需要检查 return 值是否为 1,如果不是,则决定要做什么,例如读取字符串或刷新直到行尾,还管理 EOF 案例
注意以防 scanf
什么都不做 op 未设置
也可以:
int op;
printf("Choose an option:\n 1. option 1\n 2. option 2\n 3. option 3\n");
do{
if (scanf("%d", &op) != 1) {
// flush all the line
while ((op = getchar()) != '\n') {
if (c == EOF) {
puts("EOF, abort");
exit(0); /* what you want */
}
}
op = -1; /* invalid value */
}
switch(op){
case 1: (instruction); break;
case 2: (instruction); break;
case 3: (instruction); break;
default: puts("\nPlease enter a valid option");
}
}
}while(op<1 || op>3);
我鼓励你从不相信一个输入并且总是检查return值scanf
等等
%d
转换说明符仅查找十进制输入。消耗字符或字符串不起作用。如果你输入一个字符而不是一个十进制值,该指令将失败,并且因为 op
没有初始化你有 undefined behavior.
要使用 scanf()
捕获字符串,请使用 %s
转换说明符或使用 fgets()
。对于只捕获一个字符,请使用 %c
转换说明符和 scanf()
.