為什麼這篇strcat意思鄉民發文收入到精華區:因為在strcat意思這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者overhead (overhead)看板C_and_CPP標題Re: [問題] 用memcpy...
我沒有仔細看你的本文,不過針對你補充的部分:
Ptr->ListString = (char *)malloc ((Length + 1) * sizeof(char));
memset (Ptr->ListString, '\0', Length + 1);
memcpy (Ptr->ListString, CharPtr, Length);
strcat (Ptr->ListString , "\0");
printf ("%s", Ptr->ListString);
printf (" %d\n",Length);
有些建議
1. strxxx系列function以及%s顧名思義都是在處理string
string的定義就是結尾為0(='\0')的char array
因此你沒有放'\0'在結尾之前,都別用這些functions,會壞掉
(這也是為啥有strxxx_s系列的理由)
2. memxxx系列的效率比strxxx系列高很多
因為後者除了要處理array以外,還要隨時注意'\0'到了沒
3. 雖然memxxx比較快,但copy本質上就是比用指標重複利用一塊data來得慢
所以盡量用指標處理資料傳遞,當然用指標比較難而且比較多限制就是
4. 如果你打定主意這個array都要用string形式處理,那memset就不用做了
浪費成本
舉個例子: a[0]='A', a[1]='B', a[2]='\0', a[3]='C'
b[0]='A', b[1]='B', b[2]='\0', b[3]='\0'
用printf("%s %s", a, b)印出來的a,b字串是一模一樣的,都是AB
不管a[3]是多少,從s[0]開始掃到a[2]發現有'\0'時,電腦就會結束掃下去了
5. 承第一點,strcat的意思是"在str開始第一個出現'\0'的位置後面接上指定字串"
言下之意是,如果你能接上指定字串"\0",代表它前面有個'\0'
另外"\0"是個字串,裡面有\跟0,用單引號包起來的'\0'才是0的意思
你strcat (Ptr->ListString , "\0");這一行是一點意義也沒有的
真正幫你補0的是你一開始的memset (Ptr->ListString, '\0', Length + 1);
可如同我第四點所說的,你這樣做是有點浪費成本的
因為[0]~[Length]才改完的值隨即會被memcpy蓋過,很心酸~
(也是可以寫啦,看風格,有人覺得浪費點成本但是初始時寫memset比較整齊)
建議如下:
Ptr->ListString = (char *)malloc ((Length + 1) * sizeof(char));
memcpy (Ptr->ListString, CharPtr, Length); //等同[0]~[Length-1]裡放滿值
*(Ptr->ListString + Length) = '\0'; //[Length]放'\0',等同補成完整string
printf ("%s", Ptr->ListString); //因為[Length]放'\0',所以可以正常顯示
printf (" %d\n",Length);
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.43.139
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1454516460.A.04E.html
※ 編輯: overhead (118.166.43.139), 02/04/2016 00:21:58
※ 編輯: overhead (118.166.43.139), 02/04/2016 00:26:17