繁体   English   中英

如何在C中反转一个字符串(不在原处)?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM