Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用函数反转字符串,并将整个字符串返回到主函数_C_String_Pointers_Reverse - Fatal编程技术网

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

C 使用函数反转字符串,并将整个字符串返回到主函数,c,string,pointers,reverse,C,String,Pointers,Reverse,我已经编写了以下代码片段,但它不起作用。 有人能帮我吗?我错在哪里 char *xstrrev(char *string) { int len=0,i=0; char *reverse; while(*string!='\0') { len++; string++; } len=len-1; while(len>=0) { *reverse=string[len]; r

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

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

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

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

问题以

  *reverse=string[len];
其中reverse未初始化。这引起了人们的注意

您需要初始化reverse,使其指向有效的内存位置,然后才能解除对指针的引用

由于您希望从函数返回新的字符串,并在调用方中使用它,因此在malloc调用成功检查后,您应该使用内存分配器函数,例如分配内存并用返回的指针初始化反向。一旦使用完,您还需要注意释放分配的内存

在那之后,按照你的逻辑,你正在做反向++;最后,返回的是相反的,所以请考虑返回的确切值。您返回的是指向字符串结尾的指针,而不是指向字符串开头的指针。您需要保留一份反转实际开始的副本并返回该副本。

三个问题:

[1] 反转不指向有效内存区域

[2] 返回reverse将返回字符串reverse的最后一个字节地址。所以需要存储反转的开始并返回反转的开始

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

char *xstrrev(char *string)
{
    char *original_string = string;
    int len=0,i=0;
    //[1] char *reverse;
    while(*string!='\0')
    {
        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='\0';
    //[2] return reverse; 
    return reverse_to_be_returned;
}

您需要为指向的char*reverse分配空间。这可以通过或来完成

基本上:

mallocallocate在堆上分配请求的内存,并在最后返回一个void*指针

您还需要检查对malloc的任何调用的返回指针,因为如果发生错误,有时它会返回NULL

为了安全起见,您还需要在最后保存此请求的内存

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

您的代码可以如下所示:

#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] = '\0';

    return result;
}

扫描%s,名称;->扫描%9s,名称;使用返回的字符串后释放该字符串。它不工作不是一个有用的错误描述。请描述出现了什么问题以及如何出现问题。@Gerhardh:请参阅最近添加的点[3],因为该点不起作用。@KunalVerma:请注意,为了容纳\0个字符,len+1的内存需要进行malloced。@sameerkn我知道这件事,但我想知道为什么只有一件简单的事情没有出现在我的内存中brain@KunalVerma,不用担心:,如果你觉得我的答案有帮助,请投票表决。