C语言字母校验程序问题:输入非字母时无法输出无效提示
你的代码存在几个关键错误,导致无法正确检测非字母字符:
数组地址传递错误:
scanf("%s", &getFirstNameFromApplicant);中,数组名getFirstNameFromApplicant本身就是指向数组首元素的指针,不需要加&。同时为了避免缓冲区溢出,应该限制输入长度为49(数组大小减1,留一个位置给终止符\0),改为scanf("%49s", getFirstNameFromApplicant);。遍历位置错误:循环中你一直访问数组的第50个元素(索引49),而不是当前遍历的
i位置,应该把所有getFirstNameFromApplicant[49]替换为getFirstNameFromApplicant[i]。条件逻辑错误:原判断
(getFirstNameFromApplicant[49] >= 'a' == 0 && ...)的写法完全错误,正确的逻辑应该是判断当前字符既不是小写字母也不是大写字母,可以写成:if ( !( (getFirstNameFromApplicant[i] >= 'a' && getFirstNameFromApplicant[i] <= 'z') || (getFirstNameFromApplicant[i] >= 'A' && getFirstNameFromApplicant[i] <= 'Z') ) )循环提前终止:循环里的
break;会让循环只执行一次就退出,无法检查所有字符。应该把break;放到if语句块内,当发现无效字符时再终止循环(提前终止更高效)。赋值而非比较:
if (firstNameIsValid = true)是赋值操作,会把true赋值给变量,导致条件永远为真。应该改为if (firstNameIsValid)(因为变量本身是布尔值),或者if (firstNameIsValid == true)。缺少布尔类型头文件:使用
bool类型需要包含<stdbool.h>,否则部分编译器会报错。
修正后的代码
#pragma warning(disable : 4996) #include <stdio.h> #include <stdbool.h> // 必须包含这个头文件才能使用bool类型 int main() { char getFirstNameFromApplicant[50]; printf("Please enter your first name: \n"); scanf("%49s", getFirstNameFromApplicant); // 去掉&,限制输入长度 bool firstNameIsValid = true; for (int i = 0; getFirstNameFromApplicant[i] != '\0'; i++) { // 判断当前字符是否不是字母 if ( !( (getFirstNameFromApplicant[i] >= 'a' && getFirstNameFromApplicant[i] <= 'z') || (getFirstNameFromApplicant[i] >= 'A' && getFirstNameFromApplicant[i] <= 'Z') ) ) { firstNameIsValid = false; break; // 发现无效字符后提前退出循环 } } if (firstNameIsValid) printf("name is valid"); else printf("name is invalid"); return 0; // main函数应该返回int类型的值 }
内容的提问来源于stack exchange,提问作者Phi Tran

