使用函数反转字符串并将整个字符串返回给主函数

Reverse the string using Function and returning the Whole string to main function

我已经编写了以下代码片段,但它不起作用。 谁能帮我?我哪里错了??

char *xstrrev(char *string)
{
    int len=0,i=0;
    char *reverse;
    while(*string!='[=10=]')
    {
        len++;
        string++;
    }
    len=len-1;
    while(len>=0)
    {
      *reverse=string[len];
       reverse++;
       len--;
    }
    *reverse='[=10=]';
    return reverse; 
}

int main()
{
    char name[10];
    scanf("%s",name);
    printf("%s",xstrrev(name)); 
    return 0;
}

我无法在主函数中return整个字符串

问题开始(和结束)于

  *reverse=string[len];

其中 reverse 未初始化。这会调用 undefined behavior.

您需要初始化 reverse 以使其指向 有效 内存位置,然后才能取消引用指针。

因为你期望从你的函数中_return_新的_string_并在调用者中使用它,你应该使用内存分配器函数,比如malloc()来分配内存并在 malloc() 调用成功检查后使用 returned 指针初始化 reverse。您还需要注意 free()-ing 分配的内存,一旦您使用完它。

在那之后,根据您的逻辑,您正在做 reverse++;,最后,您 returning reverse,所以请考虑确切的值接受 return 教育。您正在 return 指向字符串 end 的指针,而不是指向字符串 start 的指针。您需要保留 reverse 和 return 实际开始的副本。

三个问题:

[1] reverse 未指向有效内存区域。

[2] returning reverse 将 return 字符串 reverse 的最后一个字节地址。所以需要存储 reverse 的开始和 return reverse 的开始。

[3] string 在计算长度时被完全解析,所以同样,原始字符串的开头需要保存并随后使用

char *xstrrev(char *string)
{
    char *original_string = string;
    int len=0,i=0;
    //[1] char *reverse;
    while(*string!='[=10=]')
    {
        len++;
        string++;
    }

    //[3] till here "string" is completely parsed, so it points to past the end.

    char *reverse = (char*)malloc(len + 1);
    char *reverse_to_be_returned = reverse;
    len=len-1;
    while(len>=0)
    {
        //[3] *reverse=string[len];
        *reverse = original_string[len]; 
        reverse++;
        len--;
    }
    *reverse='[=10=]';
    //[2] return reverse; 
    return reverse_to_be_returned;
}

你需要分配space给char *reverse指向。这可以用 malloc or strdup 来完成。

基本上:

malloc()allocates requested memory on the heap, and returns a void* pointer in the end.

您还需要检查对 malloc() 的任何调用的 return 指针,因为如果发生错误,有时它可以 return NULL

为了安全起见,您还需要 free 最后请求内存。

此外,由于您是 return 指针,因此需要确保它指向字符串的开头,而不是结尾。

您的代码可以如下所示:

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

#define NAMESTRLEN 10

char *xstrrev(char *string);

int
main(void) {
    char name[NAMESTRLEN+1];
    char *result;

    printf("Enter string: ");
    scanf("%10s", name);

    result = xstrrev(name);
    printf("Reversed string = %s\n", result);

    free(result);

    return 0;
}

char
*xstrrev(char *string) {
    char *result;
    size_t slen, count = 0;
    int i;

    slen = strlen(string);

    result = malloc(slen+1); /* +1 for nullbyte */
    if (!result) {
        printf("Cannot allocate space for string.\n");
        exit(EXIT_FAILURE);
    }

    for (i = slen-1; i >= 0; i--) {
        result[count++] = string[i];
    }
    result[count] = '[=10=]';

    return result;
}