C语言代码优化:实现输出大写形式的最后单词并移除特殊字符与数字
C语言代码调整方案
核心修改点
- 补全
last_word指针的初始化兜底:原代码如果字符串开头直接是单词(没有前置空格),last_word会是未初始化的野指针,触发程序崩溃,需要先判断字符串首个非空字符的位置,给last_word赋初始值。 - 调整字符遍历的终止条件:原代码用
last_word[i] > 32判断单词结束,会把ASCII值大于32的数字、标点、特殊字符都纳入遍历范围,替换为遇到字符串结束符\0就停止遍历。 - 新增字符过滤和转换逻辑:遍历每个字符时,跳过所有非英文字母的内容(数字、特殊符号),对小写字母统一减32转换为大写后输出,大写字母直接输出。
修改后完整可运行代码
#include <stdio.h> #include <unistd.h> int main() { char line[80] = "abc dfg, egh."; int i = 0; char *last_word = NULL; // 兜底处理:字符串开头直接为非空可打印字符时,直接将起始位置指向字符串开头 if (line[0] > 32) { last_word = line; } // 定位最后一段连续可打印内容的起始位置 while (line[i] != '\0') { if (line[i] <= 32 && line[i + 1] > 32) last_word = &line[i + 1]; i++; } // 遍历目标内容,过滤非字母字符、转换小写为大写 i = 0; while (last_word && last_word[i] != '\0') { char cur = last_word[i]; // 大写字母直接输出 if (cur >= 'A' && cur <= 'Z') { write(1, &cur, 1); } // 小写字母转大写后输出 else if (cur >= 'a' && cur <= 'z') { cur -= 32; write(1, &cur, 1); } // 数字、标点、特殊字符直接跳过不输出 i++; } return 0; }
效果说明
针对示例输入"abc dfg, egh.",修改后的程序会自动定位到最后一段内容egh.,过滤掉末尾的句号,将小写的e、g、h转为大写,最终输出EGH。代码保持了原有的write系统调用输出逻辑,没有引入额外的重依赖库函数。
内容的提问来源于stack exchange,提问作者Mahmoud
相关产品推荐
相关产品推荐

