C语言字符串输入验证异常:输入合法字符串仍触发循环
解决输入验证循环的问题
你的代码存在两个核心问题,导致无论输入什么都会无限提示无效:
字符串比较方式错误
直接用name != letter比较两个字符串完全不对。数组名本质是指向数组首元素的指针,name和letter是两个独立数组,地址必然不同,所以这个条件永远为真,触发无限循环。而且letter数组从未初始化,完全是多余的。缺少正确的合法性判断逻辑
你没有定义“合法字符串”的判断规则——根据需求,需要排除单个字符(字母/数字)和包含数字的输入,必须明确检查这些条件。
修正后的代码(推荐用while循环,可读性更强)
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { char name[100]; int is_valid; while (1) { // 输出黄色提示 printf("\033[0;33m"); printf("\nEnter your Name:\ni.e. Miguel\n"); printf("\033[0m"); scanf("%s", name); is_valid = 1; // 检查长度是否大于1,排除单个字符 if (strlen(name) <= 1) { is_valid = 0; } else { // 检查每个字符是否都是字母,排除数字/符号 for (int i = 0; name[i] != '\0'; i++) { if (!isalpha(name[i])) { is_valid = 0; break; } } } if (!is_valid) { // 输出红色错误提示 printf("\033[0;31m"); printf("Invalid input"); printf("\033[0m"); } else { // 输入合法,退出循环 break; } } // 输出绿色成功提示 printf("\033[0;32m"); printf("Hello, %s!", name); printf("\033[0m"); return 0; }
代码说明
- 用
while(1)实现无限循环,直到输入合法才通过break退出,比goto更易维护。 strlen(name)获取字符串长度,判断是否大于1,排除单个字符的情况。isalpha()函数(需包含<ctype.h>)检查每个字符是否为字母,确保输入不包含数字或其他符号。- 用
is_valid变量标记输入状态,逻辑清晰易懂。
如果坚持用goto实现
把循环部分改成goto的写法(不推荐,易导致代码混乱):
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { char name[100]; int is_valid; lt: printf("\033[0;33m"); printf("\nEnter your Name:\ni.e. Miguel\n"); printf("\033[0m"); scanf("%s", name); is_valid = 1; if (strlen(name) <= 1) { is_valid = 0; } else { for (int i = 0; name[i] != '\0'; i++) { if (!isalpha(name[i])) { is_valid = 0; break; } } } if (!is_valid) { printf("\033[0;31m"); printf("Invalid input"); printf("\033[0m"); goto lt; } printf("\033[0;32m"); printf("Hello, %s!", name); printf("\033[0m"); return 0; }
内容的提问来源于stack exchange,提问作者868miig
相关产品推荐
相关产品推荐

