在 c 中使用 scanf 停止无限 while 循环?
Stopping an infinite while loop using scanf in c?
我创建了一个程序,它接受 3 个由注释分隔的数字,我将使用它们进行一些计算。它将接受这些数字的用户输入,我正在使用 scanf 来接受。
这是我目前的情况:
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdbool.h>
int main(void)
{
float a, b, c;
bool continue_program = true;
while (continue_program) {
printf("Enter your coordinates: ");
scanf("%f,%f,%f", &a,&b,&c);
if(isdigit(a) && isdigit(b) && isdigit(c)){
printf("Success!");
} else {
printf("Try again!");
}
}
}
示例输出:
Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!
我知道其他人也遇到过同样的问题,并通过了这些问题的答案,但无法让他们的实现适用于此代码。
你全错了 scanf()
将 return 匹配的参数数量,而你没有检查它。
此外,isdigit()
函数接受一个整数,如果传递的参数的 ascii 值对应于一个数字,return 非 0
。
要让你的程序在满足条件时停止,你应该在循环内更改 continue_program
的值,假设你想在 scanf()
没有得到时停止 3
要读取的浮点数,它将 return 一个不同于 3
的值,因此您可以将其设置为 if
条件
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdbool.h>
int main(void)
{
float a, b, c;
bool continue_program = true;
while (continue_program) {
printf("Enter your coordinates: ");
if (scanf("%f,%f,%f", &a, &b, &c) == 3){
printf("Success!");
} else {
continue_program = false;
printf("Try again!");
}
}
}
根据 OP
的评论建议使用此解决方案
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdbool.h>
#include <string.h>
int main(void)
{
float a, b, c;
char line[100];
printf("Enter your coordinates: ");
while (fgets(line, sizeof(line), stdin) != NULL) {
size_t length;
length = strlen(line);
if (line[length - 1] == '\n')
line[length - 1] = 0;
if (strcmp(line, "0,0,0") == 0)
break;
if (sscanf(line, "%f,%f,%f", &a, &b, &c) == 3)
printf("\tSuccess!\n");
else
printf("\tTry again!\n");
printf("Enter your coordinates: ");
}
}
您没有更新代码中 continue_program
的值。因此它的值保持为真,因此无限 loop.You 必须将其更新为假以停止它。
我创建了一个程序,它接受 3 个由注释分隔的数字,我将使用它们进行一些计算。它将接受这些数字的用户输入,我正在使用 scanf 来接受。
这是我目前的情况:
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdbool.h>
int main(void)
{
float a, b, c;
bool continue_program = true;
while (continue_program) {
printf("Enter your coordinates: ");
scanf("%f,%f,%f", &a,&b,&c);
if(isdigit(a) && isdigit(b) && isdigit(c)){
printf("Success!");
} else {
printf("Try again!");
}
}
}
示例输出:
Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!Enter your coordinates: Try again!
我知道其他人也遇到过同样的问题,并通过了这些问题的答案,但无法让他们的实现适用于此代码。
你全错了 scanf()
将 return 匹配的参数数量,而你没有检查它。
此外,isdigit()
函数接受一个整数,如果传递的参数的 ascii 值对应于一个数字,return 非 0
。
要让你的程序在满足条件时停止,你应该在循环内更改 continue_program
的值,假设你想在 scanf()
没有得到时停止 3
要读取的浮点数,它将 return 一个不同于 3
的值,因此您可以将其设置为 if
条件
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdbool.h>
int main(void)
{
float a, b, c;
bool continue_program = true;
while (continue_program) {
printf("Enter your coordinates: ");
if (scanf("%f,%f,%f", &a, &b, &c) == 3){
printf("Success!");
} else {
continue_program = false;
printf("Try again!");
}
}
}
根据 OP
的评论建议使用此解决方案#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdbool.h>
#include <string.h>
int main(void)
{
float a, b, c;
char line[100];
printf("Enter your coordinates: ");
while (fgets(line, sizeof(line), stdin) != NULL) {
size_t length;
length = strlen(line);
if (line[length - 1] == '\n')
line[length - 1] = 0;
if (strcmp(line, "0,0,0") == 0)
break;
if (sscanf(line, "%f,%f,%f", &a, &b, &c) == 3)
printf("\tSuccess!\n");
else
printf("\tTry again!\n");
printf("Enter your coordinates: ");
}
}
您没有更新代码中 continue_program
的值。因此它的值保持为真,因此无限 loop.You 必须将其更新为假以停止它。