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

C语言指针与传引用参数传递问题及字符串反转代码报错咨询

字符串反转函数的问题分析与修复

问题原因拆解

1. 反转内容未存入目标字符串inversione

  • 主函数中错误初始化inversione[0] = '\0',导致strlen(inversione)直接返回0,后续遍历打印的循环完全不执行。
  • char inversione[strlen(stringa1)]的长度仅等于原字符串的有效字符数,未预留存储字符串结束符'\0'的空间,反转后的内容无法被字符串函数正确识别为合法C字符串。

2. 函数中最后一个字符'A'未输出

  • 第一个循环执行dim次cstringa++,最终指针指向原字符串的结束符'\0',而非最后一个有效字符。
  • 第二个循环首次赋值的是'\0'(无可见打印内容),后续循环处理的是从倒数第二个字符开始的内容,当循环结束时,原字符串的第一个字符'A'尚未被处理,因此不会被打印。

修正后的代码

修正后的inverter函数

void inverter(char* cstringa, int dim, char* inversion) {
    printf("%d\n", dim);
    // 移动指针到原字符串最后一个有效字符位置(跳过结束符)
    for (int i = 0; i < dim - 1; i++) {
        cstringa++;
    }
    for (int i = 0; i < dim; i++) {
        *inversion = *cstringa;
        printf("%c", *inversion);
        inversion++;
        cstringa--;
    }
    // 为反转后的字符串添加结束符,确保是合法C字符串
    *inversion = '\0';
}

修正后的主函数

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

int main() {
    char stringa1[11] = {'A', 'l', 'e', 's', 's', 'a', 'n', 'd', 'r', 'o', '\0'};
    char* pstringa1 = stringa1;

    // 分配空间时多留1位存储字符串结束符
    char inversione[strlen(stringa1) + 1];
    char* pinversione = inversione;

    inverter(stringa1, strlen(stringa1), inversione);
    printf("\n反转后的字符串:");
    for(int i = 0; i < strlen(inversione); i++) {
        printf("%c", *pinversione);
        pinversione++;
    }
    printf("\n");
    return 0;
}

修正说明

  • 调整第一个循环的次数为dim-1,让指针停在原字符串的最后一个有效字符上,避免从结束符开始赋值。
  • 在inverter函数末尾添加*inversion = '\0',确保反转后的内容是标准的C字符串。
  • 主函数中修改inversione的长度为strlen(stringa1)+1,预留结束符的存储空间,同时移除错误的inversione[0] = '\0'初始化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:28:14