2013-02-03 40 views
0

我正在刷新我的C/C++技能。我试图实现一个反转字符串的函数,但每次运行程序时都会收到一个分段错误(核心转储)。反向字符串函数给我一个分段错误

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

void revstr(char *str); 

int main() 
{ 
    char *str = "hello mofo!"; 
    revstr(str); 
    puts(str); 

    return 0; 
} 

void revstr(char *str) 
{ 
    int start = 0; 
    int len = strlen(str); 
    int mid = len/2; 
    int i, t; 
    printf("start: %d, mid: %d,len: %d\n", start, mid, len); 

    for (i = start; i < mid; ++i) 
    { 
     printf("str[%d] swapping to str[%d]: %c, %c\n", i, len - 1 -i, str[i], str[len - 1 - i]); 
     t = str[i]; 
     str[i] = str[len - 1 - i]; 
     str[len - 1 - i] = t; 
    } 
} 

该解决方案还使我有同样赛格故障:

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

void revstr(char *str); 

int main() 
{ 
    char *str = "hello mofo!"; 
    revstr(str); 
    puts(str); 

    return 0; 
} 

void revstr(char *str) 
{ 
    char *end = str; 
    char t; 
    if (str) 
    { 
     while (*end != 0) 
      end++; 
     end--; 

     while (str < end) 
     { 
      t = *str; 
      *str++ = *end; 
      *end-- = t; 
     } 
    } 
} 
+4

您不能修改文字。现在我已经给出了有用的建议,当你在实际代码中反转字符串时,请注意'std :: reverse'。 – chris

+0

你需要展示你的工作。例如,分段故障发生在哪条线上? –

+0

谢谢,@chris,我知道'std :: reverse',但我试图用C风格做到这一点。 – Osuvaldo

回答

5
char *str = "hello mofo!"; 

str的字符串字面量,它的默认const,改变它是不确定的行为,你想这个代替:

char str[] = "hello mofo!"; 
+0

'char * str =“hello mofo!”;'**与const char * str =“hello mofo!”不一样**。此外,由于历史原因,字符串文字具有'char []'和** not **'const char []'类型。 – 2013-02-03 23:07:12

+2

@ H2CO3:不符合标准工作草案中的2.14.5/8。 –

+0

@ H2CO3:更正'char * str =“hello mofo!”;'不同于const char * str =“hello mofo!”;'。第二个版本是正确的。第一个版本依赖于C++的弃用“特性”。它没有改变底层类型的类型,但改变了指针类型,所以使用C库并不痛苦。但导致这个问题未定义的行为。 –