我一直在学习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()中使用的临时块。