2014-12-05 66 views
2

我想实现一个代码,它使用了一个名为reverse的函数,它接受一个字符串并返回一个与旧字符串相反的新字符串。据我所知,函数本身可以正常工作 - 也就是说,我测试了一下,看看反向字符串:new字符串是否具有正确的值,并且它是否正确。但是,当我尝试打印这个反向字符串后,它已被返回到主函数我得到一个错误的访问代码。有没有人有任何想法?这是我的代码:函数可以返回字符串作为它们的输出吗?

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

char reverse(char *string) { 
char newstring[50]; //reversed string to be returned to the main function 
int size = strlen(string); 
int index = 0; 
for (index = 0 ; index < size ; index++) { 
    newstring[index] = *(string+size-index-1); //creates a new string that is the reverse of  the old string 
} 
return newstring; //reurns the new string 
} 


int main(int argc, const char * argv[]) { 

char string[50]; 
printf("Please enter a string you wish to reverse:\n"); 
scanf("%49s", string); // user enters a string of maximum length 50 
int size = strlen(string); 
char *reverse_string; 
reverse_string = reverse(string); // sets a pointer called reverse_string to the pointer returned by the reverse function 
for (int index = 0 ; index < size ; index++) { 
    printf("%c", *(reverse_string+index));// prints the reversed string value by value 
} 
    return 0; 
} 
+2

函数可以返回字符串的地址,而不是字符串本身。 – chux 2014-12-05 04:05:03

+3

由于'newstring'是一个局部变量,所以返回'newstring'是一个问题。 – chux 2014-12-05 04:06:28

+0

函数可以返回指针。 – 2014-12-05 04:26:04

回答

2

您需要更改函数的声明,以便它返回char *而不仅仅是char。在你的主循环中,你目前正在为reverse_string分配一个char而不是char *。

+1

好,那么我该怎么做?我试着改变函数声明为:char * reverse(char * string),但是当我尝试反转字符串时:苹果我所得到的是e ??? 0 – Adam 2014-12-05 10:20:15

+0

您还需要malloc(为内存分配)变量_newstring_在反函数内,因为它是一个局部变量。记住你可以在这里使用sizeof()函数来使事情更健壮:) – TheOmegaPostulate 2014-12-07 22:27:41

0
char reverse(char *string) 

函数返回是一个char数据类型。它将允许你返回一个字符而不是整个字符串。您可以将数据类型作为返回指向char的指针。 char *。它将允许你返回一个字符串。

然后使用该函数中的变量并使用malloc函数分配内存。如果你使用普通变量,那么它将不起作用。

0

无论何时在c中打开花括号,都会创建一个新的堆栈框架,并且当您关闭相应的花括号时,它会被销毁破坏。问题是在这些大括号内创建的所有变量也被破坏,并且您返回的任何address都是无用的,因为它不存在。此问题的解决方法是您可以在堆上分配内存(使用malloc)并返回地址(堆由整个程序共享),或者可以将字符串作为参数传递并使用它来存储反向字符串(伪调用-引用)。

0

假设reverse()的声明确实返回了char *,问题是您要返回一个指向reverse()中本地声明的变量(newstring)的指针。这意味着一旦您退出该功能,该变量的地址就不再可用。您至少有以下选项:

  1. 声明全局变量(在函数定义上方)。

  2. 创建(例如使用malloc)堆上的变量:

    字符* newstring =(字符*)malloc的(50);

0
  1. 代码不应该试图返回局部变量newstring的地址是使用了后引用(printf("%c",...)的那个时候,局部变量的内容和存在是无效的。

  2. 当返回一个指针时,函数的返回类型应该是一个类似于char *reverse()而不是char reverse()的指针。

  3. 这一切都可以通过反转字符串到位解决。

    void reverse2(char *string) { 
        size_t rightp1 = strlen(string); 
        size_t left = 0; 
        while (left < rightp1) { 
        rightp1--; 
        char t = string[left]; 
        string[left] = string[rightp1]; 
        string[rightp1] = t; 
        left++; 
        } 
    
    int main(int argc, const char * argv[]) { 
        ... 
        scanf("%49s", string); 
        reverse(string); 
        fputs(string, stdout); 
        return 0; 
    } 
    
相关问题