2013-08-12 148 views
0

我試圖用'R'替換'G'但我得到未處理的異常。替換字符串中的字符

int main() 
{ 
    char *pszStr1 = "EFGH"; 

    (++pszStr1)[1] = 'R'; 

    printf("%s", pszStr1); 
    return 0; 
} 

回答

6

您的字符串位於只讀區域。

相反,做

int main() 
{ 
    static char pszStr1arr[] = "EFGH"; 
    char *pszStr1 = pszStr1arr; 

    (++pszStr1)[1] = 'R'; 
    printf("%s", pszStr1); 
    return 0; 
} 
+5

是否有你在這裏使用'static'的原因? –

+0

你的上面的代碼工作正常。我的想法是隻讀,但如果用(pszStr1)替換(++ pszStr1)[1],它只會用'R'替換整個字符串。在這種情況下,只讀 – debugger

+0

@debugger的想法沒有關鍵的是,如果你聲明爲'char * pszStr1 =「EFGH」;'然後'pszStr1'是指向常量字符串的指針而假設如果你聲明它爲'char pszStr1 [] =「EFGH」;'然後'pszStr1'是一個可以修改的數組。注意在Glglgl的代碼中'pszStr1'指向一個數組注意到聲明'char * pszStr1 = pszStr1arr;' –

3
int main() 
{ 
    char *pszStr1 = "EFGH"; 

    (++pszStr1)[1] = 'R'; 

    printf("%s", pszStr1); 
    return 0; 
} 

在此代碼pszStr1是一個字符串,它必須被視爲const char *pszStr1 = "EFGH";。您正試圖修改只讀內存空間。

1
char *pszStr1 = "EFGH"; 

是一個字符串,但在這裏它是像你這樣寫道:const char* pszStr1 = "EFGH";

您試圖修改只讀存儲器空間...

char pszStr1[] = "EFGH"; 

你可以通過改變它變成簡單的解決這個問題

0

char * pszStr1 =「EFGH」;

保存在可執行文件的只讀部分。編譯器內部分配字符串「EFGH」,然後使pszStr1指向它。所以,你不能改變它。使用數組,而不是字符指針,象下面這樣:

 char pszStr1[] = "EFGG"; 
0

char *pszStr1 = "EFGH";是一個常數,它是不確定的,如果你改變的內容。

如果你想改變的內容,你必須採取一個數組:

char arr[] = "EFGH"; 

,你能夠做到這一點:

arr[2] = 'R'; 
0

字符串位於現代的C常量,所以聲明char *pszStr1 = "EFGH";是錯誤的,應該是const char *pszStr1 = "EFGH";。在許多操作系統中,它們最終會被標記爲只讀的內存中的一部分,操作系統強制您無法寫入它們。如果將字符串文字複製到堆棧(或堆)上的臨時字符串,則該程序起作用。

int main() 
{ 
    char str[5]; 
    char *pszStr1=str; 
    strcpy(pszStr1,"EFGH"); 

    (++pszStr1)[1] = 'R'; 

    printf("%s", pszStr1); 
    return 0; 
}