2014-10-31 86 views
0

我想做一些簡單的事情,但我一直對此持嘲弄太久。我有一個字符串,總是以特定的「標記」結尾。在「++」下方的情況下。我想用一個較短的標記替換結尾標記,讓我們說「#」。用另一個字符串替換字符串的一部分會導致段錯誤

strstr返回NULL或指向初始結束標記的指針。 strcpy應該從strstr返回指針並用「#\ 0」覆蓋「++」。

至少這是我認爲應該做的。相反,我得到了一個「賦值使指針沒有轉換的整數」警告。我已嘗試strcpy(*newThing, "#");和其他一些事情在這一點上。不會導致錯誤的事情會導致段錯誤。

在這種情況下,C是從堆棧上的一些不可變空間獲取原始字符串的存儲空間嗎?我需要使用其中一個「alloc」嗎?我也嘗試過,但可能錯過了一些東西。

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

int main() { 
    char *thing="ssssssssssssssss++"; 
    char *newThing; 

    newThing = strstr(thing, "++"); 
    strcpy(newThing, "#"); 
    printf("%s\n", thing); 

    exit(0); 
} 
+4

您不能修改C中的字符串字面值(即使您嘗試修改以「替換」它的某些部分的方式,也不會修改數組)。 – 2014-10-31 22:21:34

+0

使用'strdup'用堆分配副本替換字符串字面值,或將'thing'定義爲'char thing []'將其分配到堆棧上。此外,你應該檢查'newThing'是否爲NULL,而不是將它傳遞給'strcpy'。 – Phillip 2014-10-31 22:25:26

+4

如果我用'char thing [] =「ssssssssssssssss ++」;'替換'char * thing =「ssssssssssssssss ++」;',一切正常。 http://ideone.com/IOPCAI – 2014-10-31 22:25:28

回答

2

您的問題是thing是一個指向字符串文字的指針。在過去,你可以做到這一點,但目前的編譯器將字符串字面值存儲在非可寫內存中。

因此,當您執行您的代碼時,您會收到一個訪問衝突寫入位置(或等效消息)。

以修復

最簡單的方法:聲明與字符串文字初始化自動陣列,所有的罰款:

char thing[]="ssssssssssssssss++"; 

(數組和一個指針是不完全一樣...)

2

問題是thing是一個字符串文字。您可以使用此:

char thing[]="ssssssssssssssss++";

將分配根據需要玉米粥空間(編譯會自動計算出數組的大小)。

我GOOGLE了字符串文字將失敗的原因。我發現了一個我已經忘記的例子。 Here是。

它幾乎歸結爲:

字符串常量不能修改自己的數據,但可以修改自己的指針。另一方面,如果你有一個數組,那麼相反的情況就是如此。您不能修改指針,但可以修改數據。

對此的一個有趣的評論是:「字符串文字有一個類型。它是char數組。雖然你說「字符串文字不能修改他們的數據,但他們可以修改他們的指針,」我的主要問題是他們沒有像你所暗示的指針。指針和字符串文字實際上是分開的東西。「

相關問題