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

未知字符串最大长度时实现打印、字符统计及逆序输出的相关问题

C语言单词字符统计及逆序输出实现方案

核心问题解决思路

  • 首先禁止使用gets()函数:该函数已在C11标准中被移除,存在严重的缓冲区溢出漏洞,推荐用fgets()或getline()替代。
  • 未知输入长度的数组声明有两种可行方案:
    1. 固定长度数组:常规单词长度远小于1KB,直接声明char input[1024]即可覆盖绝大多数场景,实现成本最低。
    2. 动态内存分配:如果需要严格匹配输入长度,可通过动态申请堆内存实现,无需提前指定数组长度。

完整代码实现

1. 固定长度数组方案(推荐普通场景使用)

#include <stdio.h>

// 统计字符数:排除fgets读取的末尾换行符
int count_chars(char *str) {
    int count = 0;
    while (str[count] != '\0' && str[count] != '\n') {
        count++;
    }
    return count;
}

// 逆序输出字符串
void reverse_print(char *str, int len) {
    for (int i = len - 1; i >= 0; i--) {
        putchar(str[i]);
    }
    putchar('\n');
}

int main() {
    char input[1024];
    printf("请输入单词:");
    fgets(input, sizeof(input), stdin);

    int char_num = count_chars(input);
    printf("字符数量:%d\n", char_num);
    printf("逆序输出结果:");
    reverse_print(input, char_num);

    return 0;
}

2. 动态内存分配方案(适配任意长度输入)

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *input = NULL;
    size_t buf_size = 0;
    // getline会自动申请匹配输入长度的内存,返回值包含末尾换行符
    ssize_t char_num = getline(&input, &buf_size, stdin) - 1;

    printf("字符数量:%zd\n", char_num);
    printf("逆序输出结果:");
    for (ssize_t i = char_num - 1; i >= 0; i--) {
        putchar(input[i]);
    }
    putchar('\n');

    free(input); // 必须释放动态申请的内存,避免内存泄漏
    return 0;
}

char变量定义说明

  • 统计和逆序函数中不需要声明固定长度的char数组,直接定义char *str指针作为参数即可,传入数组名时数组会自动退化为首元素指针,可正常访问所有字符。
  • 如果用动态分配方案,主函数中初始声明char *input = NULL即可,getline()会自动完成内存申请操作。

内容的提问来源于stack exchange,提问作者Mary Jenkins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:36:00