用户输入的错误处理,直到输入正确
error handling with user input until input is correct
这段代码应该首先告诉用户输入要检查的三角形的数量。如果用户没有输入整数,则程序会告诉用户再次输入整数,直到他输入为止。
然后用户必须为三元组输入一个浮点数。
continue 在这里工作正常。但是对于第二个三元组,如果用户没有输入整数(例如他输入 2x),它会返回到 while 循环的顶部,请输入三元组的第一个数字。
我如何编辑我的代码,使其不会到达 while 循环的顶部,而是告诉用户再次输入三元组的第二个数字?
#include <stdio.h>
#include <stdlib.h>
#define request "Please enter the number of triangles to check: "
#define triplet1 "Please enter the first number of the triplet: "
#define triplet2 "Please enter the second number of the triplet: "
#define Error "[ERR] Invalid number of triangles.\n "
#define Error2 "[ERR] Invalid number for the triplet.\n"
#define UCHAR_MAX 20
int main ()
{
int triangles = 0;
char *end;
for (;;)
{
printf ("%s", request);
char buffer[30];
fgets (buffer, sizeof (buffer), stdin);
triangles = strtol (buffer, &end, 10);
if (*end != '\n' || triangles < 1 || triangles > UCHAR_MAX)
{
printf ("%s", Error);
continue;
}
break;
}
float triplet[3] = { 0.0, 0.0, 0.0 };
int i = 0;
while (i < triangles)
{
float tmp = 0.0;
printf ("%s\n", triplet1);
char buffer[30];
fgets (buffer, sizeof (buffer), stdin);
tmp = strtol (buffer, &end, 10);
if (*end != '\n' || tmp < 1)
{
printf ("%s", Error2);
continue;
}
triplet[0] = tmp;
tmp = 0.0;
printf ("%s\n", triplet2);
fgets (buffer, sizeof (buffer), stdin);
tmp = strtol (buffer, &end, 10);
if (*end != '\n' || tmp < 1)
{
printf ("%s", Error2);
continue; // goes back to the top of the while loop
}
triplet[1] = tmp;
i++;
}
return 0;
}
这是 continue 语句的预期行为。你需要为此实现内部循环。
如果您想在用户输入正确值之前进行输入,请尝试以下方法:
我没有 c 编译器,所以无法测试,但希望它应该可以工作。如果您发现任何问题,请告诉我。
while (i < triangles)
{
float tmp = 0.0;
char buffer[30];
whiel(true){
printf ("%s\n", triplet1);
fgets (buffer, sizeof (buffer), stdin);
tmp = strtol (buffer, &end, 10);
if (*end != '\n' || tmp < 1)
{
printf ("%s", Error2);
continue;
}
triplet[0] = tmp;
break;
}
tmp = 0.0;
while(true){
printf ("%s\n", triplet2);
fgets (buffer, sizeof (buffer), stdin);
tmp = strtol (buffer, &end, 10);
if (*end != '\n' || tmp < 1)
{
printf ("%s", Error2);
continue;
}
triplet[1] = tmp;
i++;
break;
}
}
continue
关键字的定义表明,无论何时在循环体内遇到它,它都会跳过当前迭代的所有剩余语句并从头开始循环,以进行后续迭代.
你想在你的程序中实现的是,不是从头开始循环,而是应该再次执行一组特定的语句,其中传递条件失败。
一种可能的解决方法是您在此处使用 goto
关键字。在 triplet2 块之前创建一个标签,当条件失败时,在该标签上调用 goto
。
label:
printf("%s\n", triplet2);
// other statements here
if(...) {
...
goto label;
}
不过,这只是一种解决方法,并不是一个好的做法。
此外,您似乎有一段重复的语句。尝试将它们包含在某些函数中,以提高代码质量和可维护性。
这段代码应该首先告诉用户输入要检查的三角形的数量。如果用户没有输入整数,则程序会告诉用户再次输入整数,直到他输入为止。
然后用户必须为三元组输入一个浮点数。 continue 在这里工作正常。但是对于第二个三元组,如果用户没有输入整数(例如他输入 2x),它会返回到 while 循环的顶部,请输入三元组的第一个数字。 我如何编辑我的代码,使其不会到达 while 循环的顶部,而是告诉用户再次输入三元组的第二个数字?
#include <stdio.h>
#include <stdlib.h>
#define request "Please enter the number of triangles to check: "
#define triplet1 "Please enter the first number of the triplet: "
#define triplet2 "Please enter the second number of the triplet: "
#define Error "[ERR] Invalid number of triangles.\n "
#define Error2 "[ERR] Invalid number for the triplet.\n"
#define UCHAR_MAX 20
int main ()
{
int triangles = 0;
char *end;
for (;;)
{
printf ("%s", request);
char buffer[30];
fgets (buffer, sizeof (buffer), stdin);
triangles = strtol (buffer, &end, 10);
if (*end != '\n' || triangles < 1 || triangles > UCHAR_MAX)
{
printf ("%s", Error);
continue;
}
break;
}
float triplet[3] = { 0.0, 0.0, 0.0 };
int i = 0;
while (i < triangles)
{
float tmp = 0.0;
printf ("%s\n", triplet1);
char buffer[30];
fgets (buffer, sizeof (buffer), stdin);
tmp = strtol (buffer, &end, 10);
if (*end != '\n' || tmp < 1)
{
printf ("%s", Error2);
continue;
}
triplet[0] = tmp;
tmp = 0.0;
printf ("%s\n", triplet2);
fgets (buffer, sizeof (buffer), stdin);
tmp = strtol (buffer, &end, 10);
if (*end != '\n' || tmp < 1)
{
printf ("%s", Error2);
continue; // goes back to the top of the while loop
}
triplet[1] = tmp;
i++;
}
return 0;
}
这是 continue 语句的预期行为。你需要为此实现内部循环。
如果您想在用户输入正确值之前进行输入,请尝试以下方法: 我没有 c 编译器,所以无法测试,但希望它应该可以工作。如果您发现任何问题,请告诉我。
while (i < triangles)
{
float tmp = 0.0;
char buffer[30];
whiel(true){
printf ("%s\n", triplet1);
fgets (buffer, sizeof (buffer), stdin);
tmp = strtol (buffer, &end, 10);
if (*end != '\n' || tmp < 1)
{
printf ("%s", Error2);
continue;
}
triplet[0] = tmp;
break;
}
tmp = 0.0;
while(true){
printf ("%s\n", triplet2);
fgets (buffer, sizeof (buffer), stdin);
tmp = strtol (buffer, &end, 10);
if (*end != '\n' || tmp < 1)
{
printf ("%s", Error2);
continue;
}
triplet[1] = tmp;
i++;
break;
}
}
continue
关键字的定义表明,无论何时在循环体内遇到它,它都会跳过当前迭代的所有剩余语句并从头开始循环,以进行后续迭代.
你想在你的程序中实现的是,不是从头开始循环,而是应该再次执行一组特定的语句,其中传递条件失败。
一种可能的解决方法是您在此处使用 goto
关键字。在 triplet2 块之前创建一个标签,当条件失败时,在该标签上调用 goto
。
label:
printf("%s\n", triplet2);
// other statements here
if(...) {
...
goto label;
}
不过,这只是一种解决方法,并不是一个好的做法。
此外,您似乎有一段重复的语句。尝试将它们包含在某些函数中,以提高代码质量和可维护性。