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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:12:53