C语言首字母缩写函数问题:仅提取每个单词首大写字母
问题拆解
你要实现的是只提取每个单词首大写字母的缩写功能,但当前代码逻辑有问题:
- 输入"Hello"时能正常输出"H.",但输入"MACinery Bean"会输出"M.C.B.",而你要的是"M.B."
- 原因是当前代码找的是「大写字母+后面跟着非大写」的字符,这会把"MACinery"里的C也揪出来,可它根本不是单词的首字母。
另外当前代码还有几个小问题:
- 没把结果存到
userAcronym参数里,反而直接用printf输出,不符合函数设计初衷; - 用
strcpy复制单个字符完全多余,直接取userPhrase[i]就行; - 循环里访问
userPhrase[i+1],当i走到最后一个字符时会越界,容易触发未定义行为; - 没必要手动声明
int isupper();,只要包含<ctype.h>头文件即可。
修正后的代码
#include <string.h> #include <ctype.h> void CreateAcronym(char userPhrase[50], char userAcronym[50]){ int len = strlen(userPhrase); int acronymIndex = 0; for (int i = 0; i < len; i++){ // 只提取每个单词的首大写字母 if (isupper(userPhrase[i])){ // 满足两种情况之一:是字符串开头,或者前一个字符不是大写(说明是新单词的首字母) if (i == 0 || !isupper(userPhrase[i-1])){ userAcronym[acronymIndex++] = userPhrase[i]; userAcronym[acronymIndex++] = '.'; } } } // 给结果字符串加结束符,避免乱码 if (acronymIndex > 0){ userAcronym[acronymIndex] = '\0'; } else { userAcronym[0] = '\0'; } // 如需打印输出,可保留这行 printf("%s\n", userAcronym); }
代码说明
- 遍历输入字符串时,只提取每个连续大写序列的第一个字符,也就是每个单词的首大写字母;
- 结果会存入
userAcronym参数,符合函数的输出要求; - 修复了越界访问的问题,同时处理了空输入的情况;
- 包含了必要的头文件
<ctype.h>(用于isupper)和<string.h>(用于strlen)。
测试示例:
- 输入"Hello" → 输出"H."
- 输入"MACinery Bean" → 输出"M.B."
- 输入"Hello WORLD" → 输出"H.W."
内容的提问来源于stack exchange,提问作者thatboinick
相关产品推荐
相关产品推荐

