[英]How do I reverse a string (not in place) in C?
我已经搜索过了,但是我所能找到的只是一个将字符串反转到位的函数。 这是我到目前为止的内容:
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.is所指出的那样,您需要为终止符'\\0'
添加一个字符,并将该终止符添加到反向字符串中。
对于您的问题, reversed
的变量存储在堆栈中,并且当函数返回时,该内存区域不再可用。 你要么必须分配与如堆内存malloc
(免费内存后用free
)或使变量static
但在这种情况下,你不能在多线程程序中使用它。
您可以为其动态分配内存:
char* reverseString(char* string)
{
int i;
int j = strlen(string);
char *reversed = malloc(j + 1);
...
在这种情况下,调用者必须记住free()返回的已分配缓冲区。
或者,您可以让调用者传入一个足够大的缓冲区来容纳反向字符串:
char* reverseString(char* string, char *reversed)
{
int i, j;
j = strlen(string);
for (i = strlen(string); i >= 0; i--)
{
...
另请注意,在您当前的代码中: char reversed[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 */
}
如果您不想在函数中分配,只需提供目标缓冲区,然后将其返回即可。 那么,由调用者承担的责任就足够大以适合源。
char* reverseString(char* source, char* reversed) {...}
是的,sizeof不是检查字符串大小的正确方法,请使用strlen()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.