C 中通过引用传递指针和参数的工作方式

问题描述 投票:0回答:1

我的 C 编程背景非常薄弱,在学校学习了非常基础的 C 语言后,我刚刚重新开始编写 C 代码。

我正在用指针做练习,以了解我对它们的掌握程度,我想编写一个非常简单的 C 函数,它接受 3 个参数,一个字符串,它的暗淡字符串和另一个字符串,然后反转它们。

我的代码如下:

void inverter (char* cstringa, int dim, char* inversion) {
    printf("%d\n", dim);
    for (int i = 0; i < dim; i++) {
        cstringa++;
    }
    for (int i = 0; i < dim; i++) {
        *inversion = *cstringa;
        printf("%c", *inversion);
        inversion++;
        cstringa--;
    }
}

主要:

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

    char inversione[strlen(stringa1)];
    inversione[0] = '\0';
    char* pinversione = inversione;

    inverter(stringa1, strlen(stringa1), inversione);
    for(int i = 0; i < strlen(inversione); i++) {
        printf("%c", *pinversione);
        pinversione++;
    }

我希望这段代码能够反转我的字符串(string1=cstringa,它的dim=dim,string2=inversion),但它并没有这样做,因为当我给他内存地址时,值没有像我预期的那样存储在inversione中反转的第一个单元格。为什么会出现这种情况?

我还注意到,当我在反相器函数中逐个字符打印反相字符串时,它不会打印最后一个字母“A”,尽管尺寸和循环设置都是正确的。为什么?

感谢您的耐心等待。

我希望得到输出中第一个字符串的反转,并且通过引用传递的参数运行正常。

arrays c pointers parameters
1个回答
0
投票

原因是因为你前进

cstringa++;
指向终止符,所以你需要将
cstringa--;
移动到第二个循环的beginning

另一个问题是使用

strlen(inversione)
时没有设置终止符,所以也需要添加该函数。

#include <stdio.h>

void inverter (char* cstringa, int dim, char* inversion) {
    printf("%d\n", dim);
    for (int i = 0; i < dim; i++) {
        cstringa++;
    }
    for (int i = 0; i < dim; i++) {
        cstringa--;
        *inversion = *cstringa;
        printf("%c", *inversion);
        inversion++;
    }
    *inversion = 0;
    printf("\n");
}

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

    char inversione[strlen(stringa1)];
    inversione[0] = '\0';
    char* pinversione = inversione;

    inverter(stringa1, strlen(stringa1), inversione);
    for(int i = 0; i < strlen(inversione); i++) {
        printf("%c", *pinversione);
        pinversione++;
    }
    return 0;
}

输出:

10
ordnasselA
ordnasselA
© www.soinside.com 2019 - 2024. All rights reserved.