You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:03:16