[問題] 把C-style字串傳進function的問題

看板C_and_CPP作者 (Zoxge)時間14年前 (2012/01/09 06:38), 編輯推噓5(5024)
留言29則, 6人參與, 最新討論串1/1
以往一直習慣用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)

01/09 07:16, , 1F
1. char a1[10]; 只寫這樣的話,裡面是垃圾值
01/09 07:16, 1F

01/09 07:17, , 2F
C string用'\0'判斷字串結束,找不到'\0'就會有問題
01/09 07:17, 2F

01/09 07:18, , 3F
寫 "" 實際上有放了一個 '\0' 進去
01/09 07:18, 3F

01/09 07:18, , 4F
2. 請看置底文十三戒第四,char *的字串不能修改
01/09 07:18, 4F

01/09 10:03, , 5F
不能弄懂ASCIZ(C風格字串)似乎是初學C\C++必犯的錯。
01/09 10:03, 5F

01/09 20:41, , 6F
如果學C++但是不了解C String,是可以接受的事嗎@@?
01/09 20:41, 6F

01/09 21:03, , 7F
我是覺得還ok的,不過有知道總是加分的
01/09 21:03, 7F

01/09 21:14, , 8F
如果永遠都有類似c++ string class能用就沒差
01/09 21:14, 8F

01/09 22:59, , 9F
string literal就是C string,所以還是要懂
01/09 22:59, 9F

01/10 00:14, , 10F
之前看書上寫說,C++能不用C string就不用..Q_Q
01/10 00:14, 10F

01/10 00:15, , 11F
果然是個麻煩的東西..
01/10 00:15, 11F

01/10 00:17, , 12F
是很麻煩,但很難完全不使用啊...XD
01/10 00:17, 12F

01/10 00:32, , 13F
在純C的環境如果不了解C string的話更是容易踩到雷
01/10 00:32, 13F

01/10 00:49, , 14F
請教一下,在C++中,有沒有是C++string不能取代Cstring
01/10 00:49, 14F

01/10 00:50, , 15F
的呢? 謝謝
01/10 00:50, 15F

01/10 00:51, , 16F
fstream檔案系列的類別,open都要吃const char *
01/10 00:51, 16F

01/10 00:51, , 17F
其實我不懂為什麼不設計成 open(string &filename, ...)
01/10 00:51, 17F

01/10 00:52, , 18F
對耶~~我以為都可以取代@@
01/10 00:52, 18F

01/10 00:55, , 19F
我之前也這麼想,不過開檔的時候就要用 c_str() 再轉換
01/10 00:55, 19F

01/10 10:38, , 20F
用string& filename的話,你傳const char*會引發ctor
01/10 10:38, 20F

01/10 10:39, , 21F
然後ctor內要配置記憶體、把C string複製一次
01/10 10:39, 21F

01/10 10:40, , 22F
我猜對某些人來說,這段過程他們無法接受 XD
01/10 10:40, 22F

01/10 10:45, , 23F
如果C++提供immutable string其實可以減少不必要的複製
01/10 10:45, 23F

01/10 12:48, , 24F
如果我沒記錯 C++11就可以傳string&了
01/10 12:48, 24F

01/10 14:56, , 25F
rvalue reference 是另一回事
01/10 14:56, 25F

01/10 18:54, , 26F
不太懂跟rvalue有什麼關係@@? overload const string&會造
01/10 18:54, 26F

01/10 18:55, , 27F
成什麼額外的cost嗎?傳const char*還是會call原本的,
01/10 18:55, 27F

01/10 18:55, , 28F
rvalue也可以轉成const string&吧?
01/10 18:55, 28F

01/10 22:16, , 29F
喔我誤會了 你是指fstream::open的參數吧
01/10 22:16, 29F
文章代碼(AID): #1F2XhGe9 (C_and_CPP)