我将给出多重代码,请各位代码探索者尽情品尝(以下都是在vs上运行,只要改scanf_s变成scanf便可在其他编译器上运行)
1.
从键盘上输入一个3位正整数,然后逆序输出
初级解答:
#include<stdio.h>
int main() {
printf("请输入3位正整数:");
int num;
scanf_s("%d", &num);
int ret=0;
while (num > 9) {
int i = num % 10;
num = num / 10;
ret = (i + ret) * 10;
}
ret = ret + num;
printf("逆序为%d\n", ret);
return 0;
}
这个虽然满足要求,但是在思路不够连贯,我想在循环条件num>0下一步到位,直接写完这个程序,那么该如何写?
中级写法:
#include<stdio.h>
int main() {
printf("请输入3位正整数:");
int num;
scanf_s("%d", &num);
int ret=0;
while (num > 0) {
int i = num % 10;
num = num / 10;
ret = ret * 10 + i;
}
printf("逆序为%d\n", ret);
return 0;
}
这个好像完美一点了,可以一步到位,但是我们是追求严谨的的人,如果对方输入的不是三位正整数,我们要写一个程序提醒对方重输。
高级写法:
#include<stdio.h>
int main() {
printf("请输入3位正整数:");
int num;
if (scanf_s("%d", &num) != 1 || num < 100 || num>999) {
printf("请重新输入3位正整数:");
return 1;
}
int ret=0;
while (num > 0) {
int i = num % 10;
num = num / 10;
ret = ret * 10 + i;
}
printf("逆序为%d\n", ret);
return 0;
}
这种好像更加完美一点了,它可以提示我们如果输入的格式不对就让我们重新输入
注解:
- 表达式
scanf("%d", &num) != 1
检查了scanf
函数的返回值,如果scanf
函数返回值不等于 1,说明未成功读取一个整数,这可能是因为用户输入了非数字字符,或者输入格式不正确。
- 如果成功读取并赋值了一个整数,则
result
的值为 1; - 如果没有成功读取任何参数(例如输入不是整数),则
result
的值为 0; - 如果发生错误或者遇到文件结束符,则
result
的值为EOF
。
但是,这个好像也不太完善,如果我们想要再它提示我们输入错误后让我们重新输入数字,而不是结束运行,那该怎么办呢?
完美解法:
#include<stdio.h>
int main() {
printf("请输入3位正整数:");
int num;
while (1) {
if (scanf_s("%d", &num) != 1 || num < 100 || num>999) {
printf("请重新输入3位正整数:");
while (getchar() != '\n') {}
}
else {
int ret = 0;
while (num > 0) {
int i = num % 10;
num = num / 10;
ret = ret * 10 + i;
}
printf("逆序为%d\n", ret);
break;
}
}
return 0;
}
完美满足上述要求,如果格式错误则提醒重新输入。
注解:
1.while(1)表示无限循环,后面应跟着break,用于跳出循环,否则一直循环,一直跳不出去。
2.getchar()
函数用于从标准输入中读取一个字符,并返回所读取的字符。当结合 while
循环和条件判断时,while (getchar() != '\n') {}
的作用是一直读取输入缓冲区中的字符,直到遇到换行符为止。换行符通常表示用户输入的结束,因此这个语句可以清空输入缓冲区中剩余的字符,使得下一次输入操作不受之前输入的干扰。
这种做法通常用于确保输入缓冲区被清空,以避免在接下来的输入操作中出现意外情况。例如,在连续进行多次输入操作时,可能会因为输入缓冲区中仍然有剩余的字符而导致程序行为异常,通过清空输入缓冲区可以有效地规避这种问题。
2.
我们把题目拓展一下,从键盘输入任意个数,然后逆序输出(注如果以0开头,如012,上面的代码可不会输出210哦,所以我们需要去思考新的代码)
#include<stdio.h>
int main() {
printf("请输入数字:");
int num;
scanf_s("%d", &num);
int ret;
while (num > 0) {
ret = num % 10;
printf("%d", ret);
num = num / 10;
}
return 0;
}
仔细观察区别,这次我们的第二给printf中没有\n这意味着每一次输出结果都在同一行输出,正因为这样,所以我们才能把每次输出的结果汇成一行,这样才能输入正确的结果。
写在逆序的最后,其实数组也可以很好的解决逆序的问题,在上一篇文章中我们已经介绍过数组逆序的计算了,这里就不再过多追叙。