2016-05-31 74 views
2

我已经完成了一个函数,它反过来在参数中给出一个String(字符数组),但它不工作,为什么?逆c中的字符串

我得到这样的:æIGt(千吨$ 0 @

感谢您

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

char * 
inverse(char *s) 
{ 
    int i, taille = strlen(s); 
    char r[taille]; 
    for (i = 0 ; i < taille ; i++) 
    { 
     r[i] = s[taille - i - 1]; 
    } 
    r[i] = '\0';  
    return r; 
} 

int 
main() 
{  
    char s[] = "kira"; 
    char *r = inverse(s); 

    printf("%s",r); 

    return 1; 
} 
+0

请更具体地说明什么是不工作。它是否存在分割?未能编译?给出不正确的结果? – merlin2011

+0

请写出具有一致风格且可读性强的代码。而且,main()的成功值是'0'。或者更准确地说,是'EXIT_SUCCESS'。最后,如果你扭转了字符串,你应该想!你需要交换多少个字符?然后你会明白为什么它不起作用。 –

+2

您正在返回本地数组的地址,但数组已分配到堆栈上,并且在函数返回时不再可用。你需要做以下三件事之一:(1)通过调用'malloc',让'inverse'在堆上分配数组,(2)让调用者传递一个指向所需结果数组的指针,或者(3) '在原地颠倒参数字符串。 –

回答

7

您正在返回一个指向局部变量的指针。当函数反转返回时该变量被破坏,因此在函数退出后访问指针将返回无效数据。

+0

我该如何解决它? –

+3

@AmarBessalah,或者通过char * r = malloc(taille + 1)'''在堆上分配内存,或者将''''r'''作为输出变量,或者将r内容复制回''' s''' – kaspersky

+0

@ gg.kaspersky你能向我解释为什么当我不分配时,它不工作?谢谢 –

4

这是稍微很难说从你的问题,因为你没有给任何输出,但我最好的猜测是,这是因为你返回一个指向堆栈上的项目的指针,这将在下一次调用时被覆盖,在你的情况下,你需要通过inverse一个地方来表达它的答案。试试这个:

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

void inverse(char *s, char *r) 
{ 
    int i,taille=strlen(s); 


    for(i=0;i<taille;i++) 
    { 
     r[i]=s[taille-i-1]; 
    } 
    r[i]='\0'; 
} 



int main() 
{ 

char s[] = "kira"; 
char r[sizeof(s)]; 

inverse(s, r);  

printf("%s",r); 

return 1; 
} 
1

反转字符串的另一种标准方法是使用指针从字符串的开头和结尾开始工作,每次迭代交换两个字符。其交换代替原始的字符串(复印一份,如果你需要保留原始,或通过第二串并放置颠倒字符串中有)

/** strrevstr - reverse string, swaps 2 chars per-iteration. 
* Takes valid string and reverses, original is not preserved. 
* If 's' is valid and non-empty, returns pointer to 's', 
* returns NULL otherwise. 
*/ 
char *strrevstr (char *s) 
{ 
    if (!s || !*s) {  /* validate string is not NULL and non-empty */ 
     printf ("strrevstr() error: invalid string\n"); 
     return NULL; 
    } 

    char *begin = s; /* pointers to beginning and end, and tmp char */ 
    char *end = begin + strlen (s) - 1; 
    char tmp; 

    while (end > begin) /* swap both beginning and end each iteration */ 
    { 
     tmp = *end; 
     *end-- = *begin; 
     *begin++ = tmp; 
    } 

    return s; 
} 

正如你所知道的,有多种方式要解决这个问题,通过提供这些和其他答案,您应该能够调整解决方案以满足您的需求。

每种方法都有优点和缺点。动态分配一个新的内存块来保存反​​向字符串没有什么问题,它只是增加了一个额外的责任:(1)保留一个指向新块的起始地址的指针,这样(2)当它不再被释放时需要。如果您需要保留原始字符串,则将指针传递给足够大小的字符数组以保存反转字符串是保留原始字符串的另一个选项。

查看所有答案,并让我知道如果您有任何问题。