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

不使用库函数实现字符串反转,程序无输出求代码问题排查

你的字符串反转程序无输出?这些问题在搞鬼!

我来帮你梳理下代码里的几个关键问题,这些问题叠加起来导致了程序没有输出:


1. main函数参数完全写反了!

这是最核心的错误——标准的main函数参数应该是int main(int argc, char *argv[]),其中argc是命令行参数的个数,argv是存储参数的字符串数组。但你写成了int main(int argv, char *argc[]),直接把参数名和含义搞反了:

  • 你原本想判断argc != 2(检查是否传入了字符串长度参数),但现在变成了判断argv != 2,这个变量实际是原argc的值,逻辑完全错乱。
  • 你用argc[1]去取命令行参数,实际这个变量是原argv数组,内存访问逻辑全错了。

2. fgets的使用逻辑有误

你调用fgets(c, n, stdin)时,第二个参数是缓冲区的最大容量,fgets最多会读取n-1个字符,然后自动在末尾加'\0'。但这里的n是你从命令行传入的“预期字符串长度”,这会导致:

  • 实际读取的字符比你预期少1个
  • 如果命令行参数传入后,stdin缓冲区残留了换行符,fgets可能直接读取到空字符串,后续反转自然没内容。

3. 反转循环越界,且未添加字符串终止符

你的循环是for (int i = 0; i < n + 1; i++):

  • 当i增大到接近n时,c + (n - 1) - i会指向c起始地址之前的内存,属于越界访问,是未定义行为,可能直接导致程序崩溃或内存乱码。
  • 反转后的o数组末尾没有手动添加'\0',而printf("%s")需要遇到'\0'才会停止输出,所以o没有终止符的话,要么输出乱码,要么什么都不显示。

4. 命令行参数的设计不合理

让用户提前输入字符串长度完全没必要,反而增加出错概率——用户输入的长度和实际字符串长度很容易不匹配,不如直接读取字符串后用strlen获取实际长度。


修正后的代码

我调整了逻辑,修复了所有问题,还增加了健壮性判断:

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

int main(int argc, char *argv[]) {
    // 先分配一个足够大的缓冲区(也可以用动态调整,这里简化处理)
    char *input_str = malloc(1000);
    if (!input_str) {
        perror("Failed to allocate memory for input");
        return 1;
    }

    printf("Enter your string - ");
    fgets(input_str, 1000, stdin);

    // 去掉fgets自动读取的换行符(如果存在)
    input_str[strcspn(input_str, "\n")] = '\0';

    int str_len = strlen(input_str);
    char *reversed_str = malloc(str_len + 1);
    if (!reversed_str) {
        perror("Failed to allocate memory for reversed string");
        free(input_str);
        return 1;
    }

    // 执行反转
    for (int i = 0; i < str_len; i++) {
        reversed_str[i] = input_str[str_len - 1 - i];
    }
    // 必须手动添加字符串终止符
    reversed_str[str_len] = '\0';

    printf("Reversed string: %s\n", reversed_str);

    // 释放内存
    free(input_str);
    free(reversed_str);
    return 0;
}

修正点说明:

  • 把main函数参数改回标准顺序
  • 去掉了冗余的命令行参数,直接读取用户输入的字符串
  • 处理了fgets带来的换行符,避免反转结果带多余换行
  • 用strlen获取实际字符串长度,循环只在有效范围内执行,避免越界
  • 手动给反转后的字符串添加'\0',确保printf能正常输出
  • 增加了malloc失败的判断,避免内存分配出错导致崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:47:41