我正在做一个练习'do 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;
}
您的程序包含多个重复部分。由于你收集了三个数字,你应该使用一个运行三次的for循环。
for (int i = 0; i < 3; i++) {
/* ... */
}
在for循环中,你每次都会收集i+1
-th数字。如果用户未输入有效号码,则会继续尝试收集该号码。所以包含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);
}
程序的其余部分将循环遍历数组并存储元素的总和。然后输出总和。这种方法是健壮且可维护的,因为改变输入数量的数量是容易的并且重复或类似的代码部分被消除。
您可以使用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....
}