2014-11-09 61 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; 
}