2016-12-04 66 views
0

我想從字符串中替換字符(例如第二個字符)。 我的代碼有什麼問題?它可以編譯,但不是做我所需要的,它給我一個分段錯誤。謝謝!通過替換字符串的字母在C中的分段錯誤

#define _XOPEN_SOURCE 
#include <unistd.h> 
#include <stdio.h> 
#include <cs50.h> 
#include <string.h> 

int main (int argc, string argv[]) 
{ 
    string key="abcd"; 
    key[1]='f'; 
} 

並經過編譯我的代碼

~/workspace/pset2/crack/ $ clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wshadow bug.c -lcrypt -lcs50 -lm -o bug 
~/workspace/pset2/crack/ $ ./bug 
Segmentation fault 

回答

0

只能修改內存,在堆或堆棧,你"abcd"有所謂的字符串文字和所屬的程序的只讀存儲器空間,它不能被修改的地方是(不管它是否在任何體面的操作系統下運行)。

它被放置在那裏的原因是因爲string基本上只是一個char *指針,它將指向任何內存空間並且不在乎它是否在只讀空間。 (不要與C++ std::string混淆)。

爲了使它可以修改,你必須告訴C它不是一個指針,而是一個數組。

char key[] = "abcd"; 

現在C會將這個字符串放在堆棧中,您可以隨意修改它。

0
string key="abcd"; 

string基本上是char *key是字符串文字。您嘗試修改它,因此分段錯誤。

0

我沒有看到名稱string的定義,但我認爲它是類似於char *

因此,在此聲明

string key="abcd"; 

那裏被宣佈爲指向字符串文字。

字符串文字在C中未修改,任何修改字符串文字的嘗試都會導致未定義的行爲。

從C標準(6.4.5字符串文本)

7這些陣列是否是不同的條件是它們的 元素具有適當的值是不確定的。 如果程序嘗試 修改這樣一個數組,行爲是未定義的。

+0

'string'是從一個叫做'cs50'庫一個typedef,你得到它的權利 - 這只是'字符*'。顯然這個庫在哈佛的入門課程中用於從鍵盤讀取。這聽起來很有用,但是這個typedef實際上不應該存在。 – giusti

+0

@giusti感謝您的信息。:) –

0

這是因爲"abcd"並未真正複製到您的key變量中。 相反,key是一個指向這個常量字符串的指針。

如果你希望能夠修改它,你可以這樣做:

int main (int argc, string argv[]) 
{ 
    char key[] = { "some string" }; 
    key[1]='f'; 
}