2014-11-09 59 views
0

我做了一个小程序来搜索另一个字符串中的一个字符串,并通过使其反转,但我在运行时出现分段错误,将该子字符串放在主字符串中。请有人帮助我为什么我得到这个。指向c中的字符串的指针

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

int main() 
{ 
    char *str = "this is my new text"; 
    char *sstring = "is"; 
    int len = strlen(str); 
    int slen = strlen(sstring); 
    char *tstring; 
    tstring = str; 
    int flag = 0; 
    while (len) 
    { 
     if(*tstring == *sstring){ 
     int i; 
     for(i =0;i < slen; i++){ 
      if(*(tstring+i) == *(sstring + i)) 
      { 
       flag = 1; 
      } 
      else 
      { 
       flag = 0; 
       break; 
      } 
     } 
    } 
    if(flag) 
    { 
     int tlen = slen; 
     while(slen-- && (* tstring++ = *sstring + (slen - 1))) 
      ; 
     tstring = tstring + tlen; 
     len = len - tlen; 

    } 
    len --; 
    tstring++; 
} 
printf("%s",str); 
return 0; 

}

在波纹线得到错误

while(slen-- && (* tstring++ = *sstring + (slen - 1)))

请别人帮

感谢 拉比

+3

'tstring'和'sstring'都指向通常存储在只读存储器中的字符串文字。您需要将字符串放在可写入的缓冲区中。如果字符串的大小没有改变,你可以选择'char str [] =“这是我的新文本”;' – 2014-11-09 00:20:42

+0

对不起,我的坏。 – saruftw 2014-11-09 00:26:59

+0

嗨,感谢您的回复,并在我的理解char * str,char * tstring和“这是我的新文本”将执行堆栈内存位置,但它们如何为堆栈中的只读内存和可写内存分配内存可让您我知道或任何提及它都会有很大的帮助。 – 2014-11-10 05:08:54

回答

0
char *str = "this is my new text"; 
char *sstring = "is"; 
int len = strlen(str); 
int slen = strlen(sstring); 
char *tstring; 
tstring = str; 

在这一点上,tstring指向一个字符串常量,就像str一样。

while(slen-- && (* tstring++ = *sstring + (slen - 1))) 

在这里,您试图修改tstring指向的内容。但是你不能修改一个常量。

0

修复的样本。

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

int main(){ 
    char str[] = "this is my new text"; 
    char *sstring = "is"; 
    int len = strlen(str); 
    int slen = strlen(sstring); 
    char *tstring; 
    int i, flag; 

    tstring = str; 
    for(i=0; i <= len-slen; ++i){ 
     int j; 
     flag = 1; 
     for(j=0; j < slen; ++j){ 
      if(tstring[j] != sstring[j]){ 
       flag = 0; 
       break; 
      } 
     } 
     if(flag){ 
      for(j=slen-1;j>=0;--j) 
       *tstring++ = sstring[j]; 
      i += slen-1; 
     } else 
      ++tstring; 
    } 
    printf("%s", str); 
    return 0; 
}