C语言姓名合法性校验问题:无法识别全空格姓名
问题分析
你的代码里全空格校验逻辑存在错误:当前仅判断字符串是否为空(name[0] == '\0'),但全空格字符串(比如" ")的首字符是空格而非'\0',会进入else分支;而循环只检查数字,不会识别全空格的情况,导致多个空格被误判为合法。
修复后的代码
#include <ctype.h> #include <string.h> int checkName(char* name) { // 校验是否为全空格字符串 int allSpaces = 1; for (int i = 0; i < strlen(name); i++) { // 若找到非空格字符,标记为非全空格 if (!isspace((unsigned char)name[i])) { allSpaces = 0; break; } } if (allSpaces) { return 1; // 全空格,姓名无效 } // 校验是否包含数字 for (int i = 0; i < strlen(name); i++) { if (isdigit((unsigned char)name[i])) { return 1; // 含数字,姓名无效 } } return 0; // 姓名合法 }
关键说明
- 使用C标准库的
isspace()判断字符是否为空白(涵盖空格、制表符等,若只想限制普通空格,可直接判断name[i] == ' ') - 先遍历字符串,只要找到一个非空白字符,就排除全空格的可能
- 将
char转为unsigned char后传入isspace/isdigit,避免处理负数值字符时出现未定义行为 - 你提到的
empty()和blank()是C++或其他框架的函数,C语言原生库中没有这些接口,因此直接用循环+标准库函数实现即可
内容的提问来源于stack exchange,提问作者Luiz Felipe Bottura Manteiga
相关产品推荐
相关产品推荐

