如何在C中反转字符串(不在适当的位置)?
我已经搜索过了,但我能找到的只是一个函数在什么地方反转字符串。以下是我目前掌握的情况:如何在C中反转字符串(不在适当的位置)?,c,string,C,String,我已经搜索过了,但我能找到的只是一个函数在什么地方反转字符串。以下是我目前掌握的情况: char* reverseString(char* string) { int i, j; char reversed[sizeof(string)]; j = strlen(string); for (i = strlen(string); i >= 0; i--) { reversed[j - i] = string[i]; }
char* reverseString(char* string)
{
int i, j;
char reversed[sizeof(string)];
j = strlen(string);
for (i = strlen(string); i >= 0; i--)
{
reversed[j - i] = string[i];
}
return reversed;
}
然而,这就碰到了反转成为局部变量的问题,因此返回指向它的指针会引发
warning: function returns address of local variable [enabled by default]
首先,表达式
sizeof(string)
返回指针的大小,而不是字符串的长度。也可以使用strlen(string)。正如ta.speot所指出的,您需要为终止的'\0'
添加一个字符,并将该终止符添加到反向字符串中
至于您的问题,变量
reversed
存储在堆栈上,当函数返回时,内存区域不再可用。您必须在堆上分配内存,例如使用malloc
(稍后使用free
)释放内存,或者使变量成为静态的
,但在这种情况下,您不能在多线程程序中使用它。首先,表达式sizeof(string)
返回指针的大小,不是字符串的长度。也可以使用strlen(string)。正如ta.speot所指出的,您需要为终止的'\0'
添加一个字符,并将该终止符添加到反向字符串中
至于您的问题,变量
reversed
存储在堆栈上,当函数返回时,内存区域不再可用。您必须在堆上分配该内存,例如使用malloc
(稍后使用free
)释放该内存,或者使变量成为静态的
,但在这种情况下,您不能在多线程程序中使用该变量。您可以为其动态分配内存:
char* reverseString(char* string)
{
int i;
int j = strlen(string);
char *reversed = malloc(j + 1);
...
在这种情况下,调用方必须记住释放()返回的已分配缓冲区
或者,您可以让调用者传入一个足够大的缓冲区,以容纳反转的字符串:
char* reverseString(char* string, char *reversed)
{
int i, j;
j = strlen(string);
for (i = strlen(string); i >= 0; i--)
{
...
还请注意,在当前代码中:charreversed[sizeof(string)]代码>是错误的,
在这个函数中,string
只是一个char*
,因此sizeof(string)
给出了一个char*
的大小,而不是这个char*指向的字符串的长度。您可以为它动态分配内存:
char* reverseString(char* string)
{
int i;
int j = strlen(string);
char *reversed = malloc(j + 1);
...
在这种情况下,调用方必须记住释放()返回的已分配缓冲区
或者,您可以让调用者传入一个足够大的缓冲区,以容纳反转的字符串:
char* reverseString(char* string, char *reversed)
{
int i, j;
j = strlen(string);
for (i = strlen(string); i >= 0; i--)
{
...
还请注意,在当前代码中:charreversed[sizeof(string)]代码>是错误的,
在这个函数中,string
只是一个char*
,因此sizeof(string)
提供了一个char*
的大小,而不是这个char*指向的字符串的长度。您可以使用malloc为反向字符串分配空间,也可以让调用者为新字符串提供空间。
后者通常可以降低编程错误导致内存泄漏的风险
void reverseString(char *reversed, char *string)
{
int i, j;
j = strlen(string);
for (i = strlen(string) - 1; i >= 0; i--)
{
reversed[i] = string[j-i];
}
reversed[j] = 0; /* Don't forget to nul-terminate the reversed string */
}
您可以使用malloc为反转字符串分配空间,也可以让调用者为新字符串提供空间。
后者通常可以降低编程错误导致内存泄漏的风险
void reverseString(char *reversed, char *string)
{
int i, j;
j = strlen(string);
for (i = strlen(string) - 1; i >= 0; i--)
{
reversed[i] = string[j-i];
}
reversed[j] = 0; /* Don't forget to nul-terminate the reversed string */
}
如果不想在函数中分配,只需提供目标缓冲区,然后返回该缓冲区。然后,责任由调用方承担,调用方的大小足以容纳源代码
char* reverseString(char* source, char* reversed) {...}
是的,sizeof不是检查字符串大小的正确方法,请使用strlen()如果不想在函数中分配,请提供目标缓冲区,然后返回该缓冲区。然后,责任由调用方承担,调用方的大小足以容纳源代码
char* reverseString(char* source, char* reversed) {...}
是的,sizeof不是检查字符串大小的正确方法,请使用strlen()获取指向反转的指针作为参数,并在此函数中定义它。@saeedn还有其他方法吗?我更喜欢在函数中创建变量并返回它/它的值,除了警告代码有更多问题之外。1.分配的缓冲区大小不正确。您需要分配strlen(字符串)+1
字节。2.复制循环中的数组索引关闭1,并将nul终止符放在反向字符串的第一位。3.无法将nul终止符放在反向字符串的末尾。如果要在函数中创建它,可以在堆上分配reversed
(使用malloc
),并返回它的指针将指向reversed
的指针作为参数,并从该函数中定义它。@saeeden有其他方法吗?我更喜欢在函数中创建变量并返回它/它的值,除了警告代码有更多问题之外。1.分配的缓冲区大小不正确。您需要分配strlen(字符串)+1
字节。2.复制循环中的数组索引关闭1,并将nul终止符放在反向字符串的第一位。3.无法将nul终止符放在反向字符串的末尾。如果要在functionAh中创建它,可以在堆上分配reversed
(使用malloc
),并返回其指针。那么,如何使内存永久化,而不是在函数返回后消失?@ChintanParikh要么在堆上声明它,要么使用静态内存,要么将指针作为参数传递。啊,我明白了。那么,如何使内存永久化,而不是在函数返回后消失?@ChintanParikh要么在堆上声明它,要么使用静态内存,要么将指针作为参数传递。