C语言无内置字符串函数实现长字符串缩写:如何拼接结果?
C语言字符串缩写功能实现问题解答
题目要求
有时像"structured programming language"或"computer science and engineering"这类长字符串多次书写十分繁琐。我们将长度严格超过10个字符的字符串视为过长字符串,所有过长字符串需替换为特殊缩写。缩写规则如下:
(i) 保留字符串的首字符和尾字符;
(ii) 首字符与尾字符之间的字符数量(包含空格);
例如"structured programming language"缩写为"s29c","computer science and engineering"缩写为"c30g",长度不超10的字符串则直接输出。请编写C语言程序实现该功能,字符串长度不得超过100,且不能使用内置字符串函数。
用户现有代码
#include <stdio.h> int main() { int len, n, i; char str[100], abb[5]; char ws, we; gets(str); for (i = 0; str[i] != '\0'; i++) { len = i + 1; } if (len > 10) { ws = str[0]; abb[0] = ws; for (i = 1; str[i] != '\0'; i++) { n = i - 1; we = str[i]; } } else puts(str); }
用户困惑
已获取字符串的首字符、尾字符及首尾间字符数量,但不知道如何拼接成缩写字符串,仅完成首字符赋值,后续步骤无法推进。
问题修正与实现步骤
修正字符串长度计算:
原代码中len = i + 1计算错误,循环结束时i的值就是字符串实际长度(i从0开始遍历到'\0'停止),正确长度应为len = i。首尾间的字符数直接用len - 2即可,无需额外循环计算。替换不安全的
gets函数:gets会引发缓冲区溢出风险,改用fgets读取字符串,同时手动将fgets可能读取到的换行符替换为'\0',避免影响后续长度计算。直接输出缩写结果:
无需手动拼接字符串到abb数组,利用printf直接输出首字符、中间数字、尾字符即可,避免手动处理数字转字符的复杂逻辑。
修正后的完整代码
#include <stdio.h> int main() { int len, i; char str[100]; // 读取字符串并处理换行符 fgets(str, 100, stdin); for (i = 0; str[i] != '\0'; i++) { if (str[i] == '\n') { str[i] = '\0'; break; } } // 手动计算字符串长度 len = 0; while (str[len] != '\0') { len++; } if (len > 10) { // 按规则输出缩写 printf("%c%d%c\n", str[0], len - 2, str[len - 1]); } else { // 长度不超10时手动输出原字符串 for (i = 0; str[i] != '\0'; i++) { putchar(str[i]); } putchar('\n'); } return 0; }
代码说明
- 用
fgets替代gets,保证输入安全; - 全程手动遍历处理字符串,符合题目“不能使用内置字符串函数”的要求;
- 缩写输出逻辑简洁,直接通过
printf组合首字符、中间数字和尾字符; - 短字符串输出同样采用手动遍历,不依赖内置函数。
内容的提问来源于stack exchange,提问作者NoSleepTonight
相关产品推荐
相关产品推荐

