不使用库函数实现字符串反转,程序无输出求代码问题排查
你的字符串反转程序无输出?这些问题在搞鬼!
我来帮你梳理下代码里的几个关键问题,这些问题叠加起来导致了程序没有输出:
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
相关产品推荐
相关产品推荐

