C语言自定义函数实现字符串长度与反转:反转无输出求助
问题分析与解决方案
嘿,我来帮你搞定这个反转失效的问题!你的代码里长度计算没问题,但反转功能完全没输出,核心原因是你试图修改字符串常量,这会触发C语言里的未定义行为,程序要么静默失败,要么直接崩溃。
问题出在哪?
- 字符串常量的只读属性:你在
main里直接传递"Computer"给reverse函数,这个字符串是存放在程序的只读数据段里的,操作系统不允许修改这块内存。你在reverse里用指针交换字符的操作,本质是在写只读内存,这是非法的,所以程序没法正常执行反转逻辑。 - 冗余变量:
main里的char p;完全没用,属于多余代码,可以删掉。
修复方案
下面给你两种可行的修复方式,你可以根据需求选择:
方案1:用可修改的字符数组存储字符串
把字符串常量复制到栈上的字符数组里,这样数组的内容是可写的,反转函数就能正常工作了:
#include <stdio.h> #include <conio.h> // 注意:getch()是非标准函数,GCC等编译器可能不支持,建议替换为getchar() int length(char *); char* reverse(char *); int main() { int str_len; // 把字符串常量复制到可修改的字符数组中 char input_str[] = "Computer"; str_len = length(input_str); printf("字符串长度:%d\n", str_len); printf("反转结果:%s\n", reverse(input_str)); getch(); return 0; } int length(char *p) { int i; for(i = 0; *(p + i) != '\0'; i++); return i; } char* reverse(char *p) { int len = length(p); // 直接复用你写的length函数,避免重复代码 char temp; for(int i = 0; i < len / 2; i++) { temp = *(p + i); *(p + i) = *(p + len - 1 - i); *(p + len - 1 - i) = temp; } return p; }
方案2:动态分配内存存储反转结果(不修改原字符串)
如果你不想修改原字符串,或者原字符串是只读的,可以在reverse函数里动态分配内存,把反转后的字符串存在新内存里:
#include <stdio.h> #include <stdlib.h> #include <conio.h> int length(char *); char* reverse(char *); int main() { int str_len; const char *original_str = "Computer"; str_len = length((char*)original_str); printf("字符串长度:%d\n", str_len); char *reversed_str = reverse((char*)original_str); if(reversed_str != NULL) { printf("反转结果:%s\n", reversed_str); free(reversed_str); // 必须释放动态分配的内存,避免内存泄漏 } getch(); return 0; } int length(char *p) { int i; for(i = 0; *(p + i) != '\0'; i++); return i; } char* reverse(char *p) { int len = length(p); // 分配内存,要给字符串终止符'\0'留位置 char *rev_ptr = (char*)malloc(len + 1); if(rev_ptr == NULL) { printf("内存分配失败!\n"); return NULL; } for(int i = 0; i < len; i++) { rev_ptr[i] = p[len - 1 - i]; } rev_ptr[len] = '\0'; // 别忘了加字符串终止符 return rev_ptr; }
额外提醒
getch()是非标准C函数,如果你用的是GCC等现代编译器,可能需要替换成标准的getchar(),或者添加对应的库支持。- 方案2里一定要记得用
free()释放动态分配的内存,否则会造成内存泄漏。
内容的提问来源于stack exchange,提问作者Mohsin Khan
相关产品推荐
相关产品推荐

