2013-04-29 50 views
-1

我有一個字符串:「這是一個簡單的字符串」printf(「%s」,pch)VS.而(輸出( 「%C」 PCH [I]))?

我的目標是找到(與strstr)「簡單」,並將其替換爲「樣本」。

CODE:

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

int main (int argc, char *argv[]){ 
    char *str; 
    char *pch; 

    int i=0; 

    if((str=malloc(BUFSIZ))==NULL){ 
     printf("\n\t MEMORY ERROR"); 
     exit(1); 
    } 
    if((pch=malloc(BUFSIZ))==NULL){ 
     printf("\n\t MEMORY ERROR"); 
     exit(1); 
    } 
    str="This is a simple string "; 
    pch=str; 
    while(str[i]!='\0'){ 
     printf("%c",str[i]); 
     i++; 
    } 
    printf(" -1break\n"); 

    while((*pch!='\0')){ 
     printf("%c",*pch); 
     pch++; 
    } 
    printf(" -2break\n"); 

    printf("%s %d %d %d %d\n",str,strlen(str),sizeof(*str),BUFSIZ,(BUFSIZ-strlen(str)));/*OK*/ 

    if((pch=strstr(str,"simple"))!=NULL){ 
     printf("%s \n",pch);  **/*OK*/**   
     while((*pch!='\0')){ 
      printf("%c",*pch); 
      pch++; 
     }       **/*SEG FAULT*/** 
    strncpy(pch,"sample",6); 
    printf("OK\n"); 
    } 
    printf("%s %d\n",str,strlen(str)); 
    printf("\n"); 
    return 0; 
} 

OUTPUT:

$ ./strstr 

This is a simple string -1break 

This is a simple string -2break 

This is a simple string 24 1 8192 8168 

simple string 

Segmentation fault 

$ 

問題:

不能取代 「簡單」 與 「樣本」。

問題:

如果pch點到正確的「的「簡單」爲什麼不能strncpy更換6個「樣品」的信嗎?

+0

'BUFSIZ'的價值是什麼?你也可以通過'malloc'將內存分配給'str'和'pch',然後很快重新調整,所以你在這裏泄漏內存。 – 2013-04-29 13:36:55

+0

-1。還有另一個類型的問題:'char * var =「hello world」; strcpy(var,「hello universe」);'或'char * var =「hello world」; var [5] = a;' – anishsane 2013-04-29 13:56:05

+0

anishane多數民衆贊成什麼即時通訊試圖瞭解 strcpy和var [5] = a ??之間有什麼區別? – 2013-04-29 14:05:32

回答

3

作爲總結str指針應指向與malloc/calloc/realloc或靜態的字符數組一樣char str[50]char str[] = "simple string";

char *str = "simple string"str這裏分配如下存儲器的讀/寫存儲器區域指向字面串。和文字字符串存儲在只讀存儲器區域,所以你不能編輯它

代碼批評:

1)第一下面一行是錯誤的

str="This is a simple string "; 

您已經分配的內存str,然後你沒有使用它,你已經改變了指針。指針現在指向一個文字字符串(常量字符串),而不是它的orgin內存區域(用malloc分配)。它應該是:

strcpy(str,"This is a simple string "); 

同爲

pch = str; 

pch指向的str

pch=strstr(str,"simple") 

pch也同樣在這裏文本字符串指向一個字面字符串,因爲str是一公升人刺

2)下面一行是錯誤的

strncpy(pch,"sample",6); 

pch指向文本字符串,並複製到指向文本字符串的指針是不確定的行爲,這導致崩潰

碼固定:

int main (int argc, char *argv[]){ 
    char *str; 
    char *pch; 

    int i=0; 

    if((str=malloc(BUFSIZ))==NULL){ 
     printf("\n\t MEMORY ERROR"); 
     exit(1); 
    } 

    strcpy (str, "This is a simple string "); 
    if((pch=strstr(str,"simple"))!=NULL) { 
     strncpy(pch,"sample",6); 
    } 
    printf("%s\n", str); 
} 
+0

非常感謝,我可以從中學習到「const * char」和「* char」是不是同一個東西? 現在更詳細的問題: 如果我的str通過讀取(3)接收到字符串,我仍然可以替換str內的一個單詞嗎? – 2013-04-29 14:14:25

+0

作爲總結,你的str指針應該指向一個讀/寫內存區域,像分配了malloc或靜態char數組的內存區域,比如'char str [50]'或'char str [] =「simple string」;' – MOHAMED 2013-04-29 14:17:49

+0

'char * str =「簡單字符串」,這裏的「str」指向一個文字字符串。和字面字符串存儲在只讀內存區域,所以你不能編輯它 – MOHAMED 2013-04-29 14:18:48

1

同意通過MOHAMED回答。另外,由於您已經將「pch」移動到'\ 0',即strncpy之前的while循環中的字符串結尾,因此導致了段錯誤。 strncpy現在正在寫入超出字符串「這是一個簡單的字符串」的末尾,導致分段錯誤。正如其他人所指出的那樣,通過將str(在malloc之後)重新賦值爲一個文字字符串,您也會導致內存泄漏。

+0

我只認識到,pch ++達到'/ 0'時發佈它 謝謝 – 2013-04-29 15:09:47