C语言使用isalpha()实现字母逆序输出异常如何修改
问题描述
需要实现的功能规则:
- 程序仅接收大小写字母作为合法输入
- 一旦用户输入大小写字母以外的数字、符号等非法字符,系统立即停止接收后续字符
- 最终将已经接收的合法字符逆序输出
现有代码测试异常:输入str5y时实际输出y5rts,输入数字5时程序没有停止接收字符,该场景预期输出为rts,未达到功能要求。
原有代码问题点
- 输入读取逻辑错误:使用
scanf("%20s", users_enter)会一次性读取整段连续输入,无法做到遇到非法字符立即停止接收,非法字符后方的内容也会被存入数组 - 长度计算逻辑错误:遍历到第一个非法字符时,没有在非法字符位置截断有效内容,反而调用
strlen()获取整段输入的总长度,导致非法字符和后续输入都被纳入输出范围 - 遍历边界不合理:循环固定遍历到下标20的位置,没有考虑字符串提前遇到结束符
\0的场景,存在内存越界访问风险 isalpha()参数存在风险:未对传入的char值做类型转换,当char为有符号类型、传入值为负时会触发未定义行为
修正后可运行代码
#include <stdio.h> #include <ctype.h> int main(void) { char users_enter[21]; // 预留20位存合法字符+1位存字符串结束符 int valid_len = 0; char input_ch; printf("Please print the string: \n"); // 逐字符读取,最多接收20个合法字符 while (valid_len < 20) { input_ch = getchar(); // 遇到非字母字符立刻终止读入 if (!isalpha((unsigned char)input_ch)) { break; } users_enter[valid_len] = input_ch; valid_len++; } // 逆序输出合法字符 for (int i = valid_len - 1; i >= 0; i--) { printf("%c", users_enter[i]); } printf("\n"); return 0; }
修正逻辑说明
- 改用
getchar()逐字符读取输入,每读入一个字符立刻做合法性校验,遇到非法字符直接跳出读入循环,符合"立即停止接收字符"的要求 - 用独立变量
valid_len实时统计合法字符的数量,逆序输出时直接以该值为边界,不会输出非法字符及后续内容 - 传入
isalpha()的字符强转为unsigned char,规避有符号char传负值的未定义行为 - 移除了冗余的
string.h头文件依赖,不需要调用strlen()计算字符串长度
内容的提问来源于stack exchange,提问作者Cedric xu
相关产品推荐
相关产品推荐

