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

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);
}

用户困惑

已获取字符串的首字符、尾字符及首尾间字符数量,但不知道如何拼接成缩写字符串,仅完成首字符赋值,后续步骤无法推进。

问题修正与实现步骤

  1. 修正字符串长度计算:
    原代码中len = i + 1计算错误,循环结束时i的值就是字符串实际长度(i从0开始遍历到'\0'停止),正确长度应为len = i。首尾间的字符数直接用len - 2即可,无需额外循环计算。

  2. 替换不安全的gets函数:
    gets会引发缓冲区溢出风险,改用fgets读取字符串,同时手动将fgets可能读取到的换行符替换为'\0',避免影响后续长度计算。

  3. 直接输出缩写结果:
    无需手动拼接字符串到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:56:00