如何在C语言乘法表程序中实现输入整数校验?
没问题,我来帮你搞定这个输入校验的需求!你的核心问题在于scanf("%d", &n)本身没办法区分合法整数和像1a这种部分匹配的输入,而且也没做非正整数的判断,下面给你修改后的完整代码,我会逐点解释关键改动:
完整修改后的代码
#include <stdio.h> #include <stdlib.h> #include <ctype.h> // 用于isspace函数 // 输入校验函数 void check_input(int n, int scan_result) { // 先处理非正整数的情况 if (n <= 0) { printf("The number enter must be greater than 0\n"); exit(EXIT_FAILURE); } // 处理部分匹配的非法输入(如"1a") if (scan_result == 1) { int c; // 跳过所有空白字符 while ((c = getchar()) != EOF && isspace(c)); // 如果剩下的不是EOF,说明有非法字符 if (c != EOF) { printf("wrong input!\n"); exit(EXIT_FAILURE); } } else { // 完全没读到整数的情况(如输入"abc") printf("wrong input!\n"); exit(EXIT_FAILURE); } } // 乘法表打印函数 void multible(int n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { printf("%d*%d=%d ", j, i, i*j); } printf("\n"); } } int main (int argc, char **argv) { int n; printf ("Enter an integer: "); // 保存scanf的返回值,判断是否成功读取整数 int scan_result = scanf ("%d", &n); check_input(n, scan_result); multible(n); return 0; }
关键改动说明
- 捕获
scanf的返回值:scanf("%d", &n)会返回成功读取的整数个数。如果输入是纯合法整数,返回1;如果输入完全不是整数(如abc),返回0;如果是1a这种部分匹配,返回1但输入缓冲区残留非法字符。我们把这个返回值传给校验函数做判断。 - 处理部分匹配的非法输入:用
getchar()循环读取输入缓冲区的剩余字符,先跳过空白字符,之后如果还能读到非EOF的字符,就说明输入里有非法内容,比如1a里的a。 - 非正整数校验:在校验函数里直接判断
n <= 0,输出对应的提示后终止程序。 - 错误终止逻辑:只要校验失败,就调用
exit(EXIT_FAILURE)退出,避免继续执行乘法表的代码。
这样修改后,不管是输入1a、abc还是-5、0,都能正确给出对应的错误提示啦!
内容的提问来源于stack exchange,提问作者An Mạnh
相关产品推荐
相关产品推荐

