2013-11-26 172 views
0

我想用一个函数和一些指针来反转一个字符串,但我无法获得更新原始字符串的函数。带指针的反向字符串?

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


void rev(char* string) 
{ 
    char str2[strlen(string)]; 
    char *p1; 
    char *p2; 

    p1 = string + strlen(string)-1; 
    p2 = str2; 

    while(p1 >= string) 
     *p2++ = *p1--; 

    *p2 = '\0'; 
    p2 = p2 - strlen(string); 

    string = p2; // This codesn't seem to update s1 or s2 

} 

int main(void) 
{ 
    char s1[100] = "What does the fox say?"; 
    char s2[100] = "Titanic sinks"; 

    rev(s1); 
    rev(s2); 

    printf("\n\n%s\n", s1); 
    printf("%s\n", s2); 

    return 0; 
} 

该功能的工作原理,但我不能得到主字符串中的字符串与反向字符串更新。 Imo string = p2应该将字符串更新为其反向值。它确实,但只在函数内部,而不在主函数中...

+1

我不t认为,这工作:'char str2 [strlen(str荷兰国际集团)]'。 – Batuu

+3

@Batuu C99的可变长度数组 – Deck

+1

而不是创建str2,只是使用原始字符串,并使用指针交换字符。 – imran

回答

5

您还需要实现交换的语义,否则你失去的原始字符

void rev(char *s) 
    { 
     if (s != NULL) 
     { 
      int n = strlen(s) - 1; 
      char *p1 = s; 
      char *p2 = s + max(n, 0); 

      while (p2 > p1) 
      { 
       char temp = *p1; 
       *p1++ = *p2; 
       *p2-- = temp; 
      } 
     } 
} 
+1

除了传递空字符串时未定义的行为之外,它比发布的任何其他答案都要近得多。即使这个UB可以通过适当地重新定位后置和从'p2'初始值设定中去除'-1'来解决。 – WhozCraig

+0

啊,坦克你:) – user3032809

+0

@WhozCraig真的,对我来说这是一个有趣的练习,我可以多快地把这块块弄出来:) – Laurijssen

0

C使用通过值传递语义与指针以及任何其他值。当你传递一个函数指针时,它的值被复制到变量string。任何对string的更改都将保留在该函数的本地(但对指向的数据的更改将保留)。您可能想要返回一个指向修改数据的指针,或者修改字符串“in-place”。

+0

我想修改函数中的字符串,我也希望输入字符串在main中受到影响。 – user3032809

+0

然后你需要在原地修改字符串,或者创建一个新的字符串来表示修改过的字符串并返回一个指向它的指针。只更改指针是不够的,因为只修改了指针的副本。 – kviiri

0

好了,你可以改变这一点:string = p2;这样:strcpy(string, p2);

它会工作得很好。

0

您还可以使用strrev函数。在string.h,它被定义为如下:

字符* strrev(字符*)

它改变字符串中的所有字符以逆序除了终止空字符。

例如下面的代码改变数组扭转顺序并将其打印在屏幕上:

char *a = "HELLO";

strrev(a);

printf("%s", a);