看板 C_and_CPP 關於我們 聯絡資訊
以往一直習慣用C++ string 最近想試試看用C-style字串,遇到幾個小問題 小弟的問題用紫色的字標起來了,麻煩高手解惑呀!感恩! (是在linux工作站上compile的) 程式碼如下: #include <iostream> using namespace std; char *func(char *); int main(){ char a1[10]="";//如果這裡只打char a1[10];的話,cout出來的東西會壞掉,why? char *pS1=func(a1); cout<<"1. "<<strlen(pS1)<<" "<<pS1<<endl; char *a2="";//這樣的宣告方式,不管有沒有加上="", //傳進去後在strcat那裡都會segmentation fault,why? char *pS2=func(a2); cout<<"2. "<<strlen(pS2)<<" "<<pS2<<endl; return 0; } char *func(char *cstr){ cout<<"before:"<<strlen(cstr)<<" "<<cstr<<endl; strcat(cstr, "abc"); cout<<"after :"<<strlen(cstr)<<" "<<cstr<<endl; return cstr; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.12.118 ※ 編輯: Zoxge 來自: 180.177.12.118 (01/09 07:02) ※ 編輯: Zoxge 來自: 180.177.12.118 (01/09 07:03)
james732:1. char a1[10]; 只寫這樣的話,裡面是垃圾值 01/09 07:16
james732: C string用'\0'判斷字串結束,找不到'\0'就會有問題 01/09 07:17
james732: 寫 "" 實際上有放了一個 '\0' 進去 01/09 07:18
james732:2. 請看置底文十三戒第四,char *的字串不能修改 01/09 07:18
DEATHX:不能弄懂ASCIZ(C風格字串)似乎是初學C\C++必犯的錯。 01/09 10:03
bernachom:如果學C++但是不了解C String,是可以接受的事嗎@@? 01/09 20:41
diabloevagto:我是覺得還ok的,不過有知道總是加分的 01/09 21:03
james732:如果永遠都有類似c++ string class能用就沒差 01/09 21:14
littleshan:string literal就是C string,所以還是要懂 01/09 22:59
bernachom:之前看書上寫說,C++能不用C string就不用..Q_Q 01/10 00:14
bernachom:果然是個麻煩的東西.. 01/10 00:15
james732:是很麻煩,但很難完全不使用啊...XD 01/10 00:17
james732:在純C的環境如果不了解C string的話更是容易踩到雷 01/10 00:32
bernachom:請教一下,在C++中,有沒有是C++string不能取代Cstring 01/10 00:49
bernachom:的呢? 謝謝 01/10 00:50
james732:fstream檔案系列的類別,open都要吃const char * 01/10 00:51
james732:其實我不懂為什麼不設計成 open(string &filename, ...) 01/10 00:51
bernachom:對耶~~我以為都可以取代@@ 01/10 00:52
james732:我之前也這麼想,不過開檔的時候就要用 c_str() 再轉換 01/10 00:55
littleshan:用string& filename的話,你傳const char*會引發ctor 01/10 10:38
littleshan:然後ctor內要配置記憶體、把C string複製一次 01/10 10:39
littleshan:我猜對某些人來說,這段過程他們無法接受 XD 01/10 10:40
littleshan:如果C++提供immutable string其實可以減少不必要的複製 01/10 10:45
hilorrk:如果我沒記錯 C++11就可以傳string&了 01/10 12:48
littleshan:rvalue reference 是另一回事 01/10 14:56
hilorrk:不太懂跟rvalue有什麼關係@@? overload const string&會造 01/10 18:54
hilorrk:成什麼額外的cost嗎?傳const char*還是會call原本的, 01/10 18:55
hilorrk:rvalue也可以轉成const string&吧? 01/10 18:55
littleshan:喔我誤會了 你是指fstream::open的參數吧 01/10 22:16