我一直在学习C语言,我决定通过创建一些函数来操作字符串来练习使用我的知识。我编写了一个string reverser函数,以及一个主函数,它请求用户输入,通过stringreverse()发送,并打印结果。
基本上我只想了解我的功能是如何工作的。当我用“tempstr”作为第一个参数调用它时,是否将其理解为数组中第一个元素的地址?基本上就像是说&tempstr[0],对吧?
我想回答这个问题会告诉我:如果我给tempstr数组分配一个char*指针,然后把它作为第一个参数发送给stringreverse()与我现在的做法有什么区别吗?我想知道是发送数组tempstr的副本,还是发送内存地址。

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

int main()
{
    char* stringreverse(char* tempstr, char* returnptr);

    printf("\nEnter a string:\n\t");

    char tempstr[1024];

    gets(tempstr);
    char *revstr = stringreverse(tempstr, revstr); //Assigns revstr the address of the first character of the reversed string.

    printf("\nReversed string:\n"
           "\t%s\n", revstr);

    main();
    return 0;
}

char* stringreverse(char* tempstr, char* returnptr)
{
    char revstr[1024] = {0};

    int i, j = 0;

    for (i = strlen(tempstr) - 1; i >= 0; i--, j++)
    {
        revstr[j] = tempstr[i]; //string reverse algorithm
    }

    returnptr = &revstr[0];
    return returnptr;
}

谢谢你的时间。任何其他的评论都会有帮助。.编程仅几周:p
编辑:多亏了所有的答案,我才弄明白。以下是我的解决方案:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void stringreverse(char* s);

int main(void)
{
    printf("\nEnter a string:\n\t");

    char userinput[1024] = {0}; //Need to learn how to use malloc() xD

    gets(userinput);
    stringreverse(userinput);

    printf("\nReversed string:\n"
           "\t%s\n", userinput);

    main();
    return 0;
}

void stringreverse(char* s)
{
    int i, j = 0;
    char scopy[1024]; //Update to dynamic buffer
    strcpy(scopy, s);

    for (i = strlen(s) - 1; i >= 0; i--, j++)
    {
        *(s + j) = scopy[i];
    }
}

最佳答案

首先,一个细节:

int main()
{
    char* stringreverse(char* tempstr, char* returnptr);

原型应该在main()之外,如下所示:
char* stringreverse(char* tempstr, char* returnptr);

int main()
{

至于你的主要问题:变量tempstr是一个字符*,即字符的地址。如果您使用c的索引符号,比如tempstr[i],那么本质上与*(tempstr+i)相同。revstr也是如此,只是在这种情况下,您返回的内存块的地址将在它指向的数组超出作用域时被删除。你有一个正确的想法,把一些内存的地址传进来,把反向的字符串写到内存中,但实际上你并没有把数据复制到那个块所指向的内存中。另外,行:
returnptr = &revstr[0];

不按你想的做。不能将新指针分配给returnptr;如果确实要修改returnptr,则需要传入其地址,因此参数将被指定为char**returnptr。但是不要这样做:相反,在main()中创建一个块来接收反转的字符串,并在returnptr参数中传递它的地址。然后,使用该块,而不是现在在stringreverse()中使用的临时块。

08-24 22:11