我正在练习while程序,希望用户输入三个数字,该程序将在屏幕上打印总和。收到答案后,程序将询问用户是否要输入另外三个数字来获得另一个答案,依此类推。
我很好...
问题::如果用户输入的不是整数(“ A,!,%”)等,我希望程序重新提示用户重新输入数字。查看程序中的注释。
#include <stdio.h>
/*
Do - While
This program shall ask the user to enter
three numbers and print out the sum. Entering letters
or special characters will ask the user to re-enter that
number.
example:
Enter Number 1: 2
Enter Number 2: 5
Enter Number 3: 9
Answer is 16
...
Enter Number 1: 2
Enter Number 2: yum here user incorrectly enters letters
Enter Number 2: 8 re-prompted to enter number to continue
Enter Number 3: 9
Answer is 19
*/
int main(void) {
int a,b,c,ans,n;
do{
do{
printf("Enter Number 1: ");
scanf("%d", &a);
printf("\n");
}
while((a>0) || (a<0)|| (a==0));
do{
printf("Enter Number 2: ");
scanf("%d", &b);
printf("\n");
}
while((b>0) || (b<0)|| (b==0));
do{
printf("Enter Number 3: ");
scanf("%d", &c);
printf("\n");
}
while ((c>0) || (c<0)|| (c==0));
ans = a+b+c;
printf("Answer is %d\n\n", ans);
printf("Press 1 to start over, or 0 to quit...");
scanf("%d",&n);
printf("\n");
}while (n!=0);
return 0;
}
答案 0 :(得分:0)
您可以使用fgets获取输入,并使用strtol()将用户输入的字符串转换为int。如果strtol返回0时用户输入的内容不是以数字开头或其中没有数字。从那里可以检查用户输入是否为0,然后再次提示用户,直到a不为0。
*instead of scanf()*
char num1[5];
char *end;
fgets(num1, 5, stdin);
a = strtol(num1, &end, 10);
while( a = 0){
fgets....
}
答案 1 :(得分:0)
您的程序包含多个重复的部分。由于您要收集三个数字,因此应该使用一个运行3次的for循环。
for (int i = 0; i < 3; i++) {
/* ... */
}
在for循环中,您每次都收集第i+1
个数字。如果用户输入的数字无效,则您将继续尝试收集该数字。因此,包含printf
和scanf
的do-while循环将进入for循环内。
for (int i = 0; i < 3; i++) {
do {
printf("Enter Number %d: ", i+1);
scanf( /* ... */ );
} while ( /* ... */ );
}
scanf
返回已成功读取为int
的输入项目数。因此,只要scanf
的返回值为零,就应该重复执行do-while循环。我们可以将返回值存储在变量中,然后在while (...);
中检查变量,但是我们可以将scanf
本身移到while (...);
中。我们还需要一个数组来存储三个输入数字。
int n[3];
for (int i = 0; i < 3; i++) {
do {
printf("Enter Number %d: ", i+1);
} while (scanf("%d", n+i) == 0);
}
程序的其余部分将遍历数组并存储元素的总和。然后,您将输出总和。这种方法既健壮又可维护,因为更改输入数字的数量很容易,并且消除了重复或类似的代码段。