C语言中如何判断用户输入是否为合法整数
问题原因
你当前代码的问题出在scanf("%d", &cislo)的行为上:它只会读取输入开头的整数部分,遇到非数字字符(比如1.5里的.)就会停止读取,剩下的字符会残留在输入缓冲区中,所以会把1.5误判为1。
解决方案
可以先读取整行输入,再通过strtol函数做严格的整数校验,确保输入除了整数和空白符外没有其他多余字符,修改后的代码如下:
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <limits.h> int main(int argc, char **argv) { char buf[1024]; char *endptr; long cislo; printf("ml' nob:\n"); // 读取整行输入,避免残留未读取字符 if (fgets(buf, sizeof(buf), stdin) == NULL) { printf("luj\n"); return 0; } // 尝试将字符串转换为长整数 cislo = strtol(buf, &endptr, 10); // 校验逻辑 int is_valid = 1; // 情况1:没有可转换的有效数字 if (endptr == buf) { is_valid = 0; } else { // 情况2:转换后还有非空白的多余字符 while (*endptr != '\0') { if (!isspace((unsigned char)*endptr)) { is_valid = 0; break; } endptr++; } } if (!is_valid || cislo < INT_MIN || cislo > INT_MAX) { printf("luj\n"); } else if (cislo == 1) { printf("Qapla'\n"); printf("noH QapmeH wo' Qaw'lu'chugh yay chavbe'lu' 'ej wo' choqmeH may' " "DoHlu'chugh lujbe'lu'.\n"); } else if (cislo == 2) { printf("Qapla'\n"); printf("Qu' buSHa'chugh SuvwI', batlhHa' vangchugh, qoj matlhHa'chugh, " "pagh ghaH SuvwI''e'.\n"); } else { printf("luj\n"); } return 0; }
逻辑说明
fgets会把用户输入的整行内容全部读到缓冲区里,不会残留未读取的字符strtol转换完成后会通过endptr返回第一个未被转换的字符的地址- 遍历
endptr之后的所有字符,如果全是空白符(比如换行、空格),说明输入是合法整数,否则就存在多余字符(比如1.5里的.5),判定为非法输入输出luj
该方案可以覆盖所有非纯整数的输入场景,符合你的需求。
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

