你需要顯示整個程序;什麼叫「trim()」?保羅的r答案是正確的,你是一個字符短,它應該至少爲:
char new_line[strlen(line) + 1];
然而,這並不總是會導致一個段錯誤,如果沒有的話,大概不會在strcpy()
。
strcpy(start_line, new_line)
爲錯誤的可能原因是start_line指向原始值line
。很可能要調用的功能等:
int main() {
trim("blah blah\tblah");
return 0;
}
如果是這樣,line
是一個指向不斷字符數組,不能修改。在許多操作系統上,這些操作都存儲在只讀存儲器區域,因此如果進行寫入嘗試,將導致立即出現分段故障。因此strcpy()
嘗試寫入此只讀位置時會出錯。
作爲一個快速測試試試這個:
int main() {
char test[100] = "blah blah\tblah";
trim(test);
return 0;
}
如果一切正常,這就是你用的strcpy()斷層的具體問題。
EDIT - 稍後更新問題以包含main()調用函數,該函數確認使用指向字符串常量的指針調用trim函數。問題行是:
char *str = "Irish People Try American Food";
這產生一個字符串,31個字符的陣列,其包括空終止其不能被修改。然後指針str
用這個常數的地址初始化,array。
更正是分配一個規則的字符數組,然後使用已知的字符串初始化。在這種情況下,分配和臨時恆定字符串文字可以或可以不被優化的,但最終的結果總是相同的 - 與所需文本初始化字符的可寫數組:
char str[100] = "Irish People Try American Food";
/* or */
char str2[] = "American People Like Irish Beer";
/* or */
char *str3[37];
strcpy(str3, "And German Beer"); /* example only, need to check length */
這些創建正常寫炭長度分別爲100,32和37。然後每個都用給定的字符串進行初始化。
ANSI/ISO C標準定義的語言使得字符串文字是不可修改的char
的數組。即使在C89中首次標準化,也是如此。在此之前,字符串文字通常是可寫的,例如在非常早期的UNIX代碼的預標準K & R C中。任一種形式的
相同字符串文字不必是截然不同的。如果 程序試圖修改任一形式的字符串文字,則 行爲未定義。 - ANSI X3.159-1989
許多C89和新的編譯器以來然後置於此陣列到.text或.RODATA段,其中它甚至可以在物理上不可寫(ROM,只讀MMU頁等),正如這裏發現的那樣。編譯器也可能會將重複的字符串常量合併爲一個以節省空間 - 而且您也不會寫入其中的一個!
事實上,這些語義上不可寫入的字符串仍然保留爲char *
類型,並且它們可以被分配並傳遞,這被稱爲妥協,即使正在起草C89標準。他們沒有使用當時全新的類型限定符const
被描述爲「不完全滿意的結果」。請參閱Richie's (DMR's)說明。
而且很顯然,這一結果仍然存在飛去,近30年後上攻的人敲敲罷了頭。
如果'line'不包含''''或'\ t''會怎麼樣?你的'new_line [i] ='\ 0';'將評估爲'new_line [strlen(line)] ='\ 0';',這是UB。 –
'new_line [strlen(line)];' - >'new_line [strlen(line)+ 1];' – chux
發佈調用'trim(char * line)'的代碼。它是否在做'trim(「Test」);'? – chux