但不能取代完整的學習,請自己好好研讀一兩本C 語言的好書,並多多實作練習。 ... 附加到s1 所指唯讀字串的後面, 造成寫入到程式無權碰觸的記憶體空間*/ strcat(s1, ... ... <看更多>
Search
Search
但不能取代完整的學習,請自己好好研讀一兩本C 語言的好書,並多多實作練習。 ... 附加到s1 所指唯讀字串的後面, 造成寫入到程式無權碰觸的記憶體空間*/ strcat(s1, ... ... <看更多>
#1. 字串的附加strcat 與strncat的使用與實作| 阿夢的程式設計天地
strcat 是C語言的函式之一,來自C語言標準函式庫,定義於string.h,它可以把第二個參數的字串附加到第一個參數之後。所以第一個參數必須保留足夠的空間 ...
編寫一個C語言程序模擬實現strcat函數. (我們不妨先模擬實現一下strcat函數, ... strcat函數原型:char *strcat(char *dest,const char *src);.
#3. 用C語言寫strcat、strcpy、strlen、strcmp | IT人
題目:在不使用<string.h>庫函式的基礎上,自行編寫出能進行字串複製(函式名: strcpy1()), 連線(函式名: strat1()), 字串長度判斷(函式名: strlen1( ) ...
C 語言strcat()用法及代碼示例. ... C庫函數char *strcat(char *dest, const char *src)附加指向的字符串src到指向的字符串的末尾dest。
#5. 字串連結指令strcat()、strncat()說明及使用範例 - Chris701203
1.指令說明: 原型為: char *strcat(char *strDestination, const char *strSource); 參數說明: · 2.使用範例: ex. void main() { · 3.實作:
#6. C 語言標準函數庫分類導覽- string.h strcat() - 程式語言教學誌
C 語言標準函數庫分類導覽- string.h strcat(). string.h 的函數strcat() ,需要兩個字串當作參數,然後把第二個參數字串的接到第一個參數的字串後面,然後回傳第一個 ...
strcat () - C語言庫函數 ... C庫函數char *strcat(char *dest, const char *src) src 指向結尾的字符串的字符串附加到指向dest。 聲明.
#8. [C] C-Style string.h 部份函式實做@ Edison.X. Blog - 痞客邦
... size_t strlen(const char* p); {; const char* beg = p;; while(*p) ++p;; return p-beg;; }; //; // [02] strcpy; //; char* strcpy(char* des, ...
#9. Strcat 實作 - 軟體兄弟
我們清楚地了解了 ..., 2009年10月8日星期四. strcat 的實作. ☆ glibc strcat. #include <string.h>.,C庫函數char *strcat(char *dest, const char *src) src指向結尾 ...
#10. 字串長度、複製、串接
在〈字元陣列與字串〉談過,在C 語言中,字串是一個字元陣列,最後一個字元以空字 ... 如果要進行字串複製,可以使用 strcpy 函式,若要複製字串中若干字元內容,可以 ...
#11. 現代C 語言程式設計(試讀本) - 技術文件
assert(0 == strcmp(s, "Hello World")); return 0;. } 由此可知C 字串在本質上是尾端為NULL 的字元陣列。當我們在實作字串相關演算法時.
#12. 在C 語言中連線字串 - Delft Stack
strcat 是C 標準庫字串工具的一部分,定義在 <string.h> 標頭檔案中。該函式接受兩個 char* 引數,並將儲存在第二個指標處的字串追加到第一個指標處。
#13. c語言實現strcpy,strcat,strcmp的函數功能 - tw511教學網
c 語言實現strcpy,strcat,strcmp的函數功能. 2020-08-12 23:03:34. 1.指針法實現strcpy(字串複製的功能) 函數原型:char * strcpy(char *str1,const char *str2)
#14. C語言strcat()函式:連線字串-技術 - 拾貝文庫網
標籤:. 標頭檔案:#include <string.h> strcat() 函式用來連線字串,其原型為: char *strcat(char *dest, const char *src); 【引數】dest 為目的字串指標,src 為源 ...
#15. 從0開始,一起學C語言吧!(Day29) - iT 邦幫忙
char *strcat (char *str1,const char *str2); char *strncat (char *str1,const char *str2 ... scanf("%c",&key); if(strchr(s,key)) printf("Founf %c in string!
#16. c語言小函式strcat - w3c學習教程
c 語言小函式strcat,strcat函式包含在string h標頭檔案裡面。功能將兩個字串連線起來。 如下strcat函式將字串s1加在了s0末尾。 inclu.
#17. 為什么我在實作strcat()時得到了錯誤的源字串輸出?
在這里,我嘗試 strcat 在C 中實作函式。問題是當我列印源字串時,它顯示我 "hyam" 沒有 "shyam" #include <stdio.h> #include <string.h> char ...
#18. strcat:將兩個char類型連線。 char d[20]=Gold
返回指向d的指針。 基本信息. 外文名稱:strcat. 用法:#include; 類型:函式; 性質:c語言 ...
#19. strcat:C函式,原型,頭檔案,功能,說明,舉例,MATLAB函式
基本介紹 · 中文名:strcat · 外文名:strcat() · 用法:#include <string.h> · 類型:函式 · 性質:c語言.
#20. C/C++ 字串連接的3種方法
C++ string 的append(); C++ string 的+= operator. 那我們就開始吧! C 語言的strcat. C 語言要連接c-style 字串通常會使用 ...
#21. [C] 每天來點字串用法(5) - strcat()、strncat() - 天上的東東w
char *strcat( char *dest, const char *src ); char *strncat( char ... 能更簡潔說明的方法了qwq,希望大家還是能透過實作一次了解這個函式的特色。
#22. c語言中,用了strcmp函式連線兩個字串陣列ab後
定義函式int strcmp(const char *s1,const char *s2);. 函式說明strcmp()用來比較引數s1和s2字串。字串大小 ...
#23. 字元陣列
C 語言允許用字串的方式對陣列作初始化賦值。 例如:. char c[]={'c', ' ','p','r' ...
#24. C語言strcat庫函數講解 - 文章整合
C 語言strcat庫函數講解 ... 從上述MSDN關於strcat庫函數的介紹中,我們可以清楚地知道strcat庫函數的頭文件是<string.h>,接收的兩個參數分別是目的地 ...
#25. C 速查手冊- 11.3 字串處理string.h - 程式語言教學誌
size_t 作為sizeof 運算子(operator) 的回傳型態(return type) ,實際上可能為unsigned int 或unsigned long 。 以下函數可以拷貝字串. 函數名稱, 功能, 函數原型. strcpy ...
#26. c語言之strcat函式Strcpy函式 - w3c菜鳥教程
c 語言之strcat函式Strcpy函式,因為面試的時候經常考到,所以就自己總結了一下。 注意點為前一個字串的空間要夠後邊字串的儲存。 strcat原型為strcat ...
#27. string.h - 維基百科,自由的百科全書
在 string.h 中定義的函式十分常用,作為C標準庫的一部分,它們被強制要求可以在任何支援C語言的平台上執行。但是,部分函式存在一些安全隱患,例如緩衝區溢位等,導致 ...
#28. C語言中一種有歷史缺陷的字串操作-strcat() - 劇多
在C語言中對於字串的操作一直詬病很多,主要是因為在C語言中字串不是一個“物件”,而是用字元陣列+'0'簡單表示。其中strcat函式就是其中之一,它給予了 ...
#29. 你所不知道的C語言:指標篇 - HackMD
指標這個好東西,當然也要從C 語言帶過去給Go 語言,連同美妙的struct。 ... char *r = malloc(strlen(s) + strlen(t)); strcpy(r, s); strcat(r, t);.
#30. C 語言講座: 5.8 字串操作
string.h 中定義了不少好用的字串函數,例如strcmp、strcat、strncpy 等等,現在請你查查它們的意義,並用C 語言把這些函數實作出來,如同我們上面實作strcpy 這個函數 ...
#31. [教學] 字串連結指令strcat()、strncat()說明及使用範例 - 中央論壇
若有不適用於其它C編譯器的地方; 還請其它的高手; 代為修改一下 ... 實作: // 實作strcat指令; // strDestination ==> 目的字串指標; // strSource ==> 來源字串指標
#32. C語言strcmp和strcpy的用法 - 人人焦點
一、c語言strcmp()用法原型:int strcmp(const char *s1, const char *s2);. 頭文件:#include <string.h>. 功能:用來比較兩個字符串.
#33. [C/C++] cstring (string.h) 函式:strcat, strncat, strcmp, strncmp
[C/C++] count 1 bits of input value by shifting. [C/C++] C語言切割字串函式strsep,分析URL GET 參數 · [C/C++] strpbrk 在字串中 ...
#34. c語言題目將兩個字串連線起來不用strcat函式
c 語言題目將兩個字串連線起來不用strcat函式,1樓尤 ... strcat( char * dst , char* src ) 函式相當於strcpy( dst+strlen(dst) , src).
#35. C語言-常用內建函數
拷貝字串[函數名稱] [語法] [說明] [strcpy ] [strcpy(char *s1, char *s2); ] [將字串s2 拷貝到s1] [strncpy ] ... strncat(s2," is a book about C language.
#36. 字串
由於C語言對字串的定義非常簡單,因此需要一些函數幫我們操作字串。 ... void strcat(char *s1, char *s2) { int i, j; for (i = strlen(s1), j = 0; s1[i] = s2[j]; ...
#37. C語言strcat_s 函式- C語言零基礎入門教程_其它 - 程式人生
一.strcat_s 函式簡介. 前面文章中介紹了關於字串拼接函式 strcat ,而 strcat_s 函式和 strcat 函式一樣,主要用於字串拼接;.
#38. C語言-strcpy與strcat的用法 - 青春問答
strcpy 的功能是將字串2複製到字元陣列1中去(包括字串結尾符'\0')。strcpy的第一個引數必須是一個字元陣列變數,第二個引數可以是一個包含字串的字元 ...
#39. C語言實現strcat / strlen / strcmp / strcpy - 开发者知识库
主要考慮兩點: 返回值對使用的便利性。 邊界,null的判斷。 strcat char *m_strcat(char *des, const char *src){ as.
#40. c語言strcat函數原型 - monickers的博客
1) c strcmp函數原型. strcat() 函數非常類似於strcpy(),除了它可以將一個字符串合並到緩沖區末尾. · 2) c語言strcat源代碼. 頭文件中定義. · 3) 編寫strcat ...
#41. C語言-如何將字元串接 | 健康跟著走
C 及C++語言沒有內建的字串類型,你只能用 . ... 串接第二個字串至新的陣列空間strcat(result, str2); return result; } int main() char *a="123456"; char *b="abcde"; ...
#42. C語言編程經典(指針系列三)——strcat函數實現 - 每日頭條
熟悉c語言的朋友都知道,strcat是c語言字符串函數庫函數之一,作用是連接兩個字符串。strcat的函數原型是extern char *strcat(char *dest,char ...
#43. [C] strlen/strcpy/strcat/strcmp的模擬實現及其他字符串庫函數
strncpy · strncat · strncmp. C語言中的函數分爲兩個大類:. 庫函數庫函數中又分爲: 標準庫 / 第三方 ...
#44. snprintf 妙無窮| 菜鳥的三年成長史 - wirelessr
C 語言中沒有像是C++的STL string一樣方便的container,我以前碰到又是數字又有文字的東西其實很苦惱,常常用笨方法來解決:利用 atoi & strcat 來做到C++ string << 的 ...
#45. C語言中strcat和strcpy的區別 - 阿洛塔
一、功能不同. 1、strcat:字串複製。把從src地址開始且含有"\0"結束符的字串複製到以dest開始的地址空間。 2、strcpy:把兩個字串連線起來,把src所 ...
#46. strcat 用法c 語言
strcat () – C語言庫函數. C庫函數char *strcat (char *dest, const char *src) src 指向結尾的字符串的字符串附加到指向dest。. C語言strcat ()函數瀏覽人數: 234 ...
#47. 第二個字串的“\0”有沒有 - WhatsUp
C 語言strcat函式:. strcat(a,b);. 表示把b串連結在a串之後,連結時從第一個串的"\0"開始覆蓋連結。 如:. char a[80]="ab";. char b[80]="cd";.
#48. C語言中strcpy函式怎麼用看題 - 櫻桃知識
strcpy ()函式只能拷貝字串。strcpy()函式將源字串的每個位元組拷貝到目錄字串中,當遇到字串末尾的null字元(\0)時,它會刪去該字元,並結束拷貝.
#49. 今天我編了小程式以完成C語言中的字串連線函式“strcat”的功能
今天我編了小程式以完成C語言中的字串連線函式“strcat”的功能,於是想到了指標來實現。但最後程式,1樓匿名使用者自己對照看一下。 main b 15 p a q b ...
#50. 淺談C語言中strcpy,strcmp,strlen,strcat函數原型 - 程式師世界
淺談C語言中strcpy,strcmp,strlen,strcat函數原型。本站提示廣大學習愛好者:(淺談C語言中strcpy,strcmp,strlen,strcat函數原型)文章只能為提供 ...
#51. C語言常用字串操作函式總結 - 程式前沿
函式名: strcpy 功能: 將引數src字串拷貝至引數dest所指的地址用法: char *strcpy(char *dest, const char *src); 返回值: 返回引數dest的字串起始 ...
#52. strcat 的實作
strcat (dest, src). char *dest;. const char *src;. {. char *s1 = dest;. const char *s2 = src;. reg_char c;. /* Find the end of the string.
#53. 在C語言中如何高效地複製和連線字串?
簡單的答案是,這是一個歷史性的意外。函式的第一個子集是由Unix第七版在1979年引入的,它由strcat、strncat、strcpy和strncpy函式組成。儘管這四個函式都 ...
#54. strcat_百度百科
中文名. 字符串連接函數 ; 外文名. strcat ; 用法. #include <string.h> ; 類型. 函數 ; 性質. c語言.
#55. c語言問題將兩個字串連線起來要求不用
4樓:欲墜星河望人間. 不用strcat連線字串. #include. int main(). ;char str2=; for(i=0;str1[i]!='\0';i++)for(j=0;str2[j]!='\0';j++)str[i+j]='\0 ...
#56. 18. 高階指標應用
在字串這一章中,我們已經介紹過兩種C語言的字串:字串陣列與字串指標,請參考下面的程式: #include <stdio.h> #include <string.h> int main() { char str[]="Hello" ...
#57. c語言strcpy()用法 - 問答酷
1、strcpy函式是複製字串的,接受兩個引數,一個是被複制字串,另一個新字串。具體的用法,首先開啟編輯器新建一個c語言的程式檔案,寫入標頭檔案和主 ...
#58. [轉錄] C 語言新手十誡(增修一版) - 看板SFFamily
作者: khoguan (Khoguan Phuann) 看板: C_and_CPP 標題: C 語言新手十誡(增修一版) 時間: Sat Sep 3 01:07:31 2005 C 語言新手十誡(The Ten ...
#59. c語言strcat函數 - chz的博客
回答:關于c語言strcat函數的問題,我是這麽理解的, 四、連接字符串C 語言中使用庫函數strcat 來連接兩個字符串: char *strcat(char *dst,char const ...
#60. C語言- 第十四章| 字串- 長度、複製、串接 - J.J.'s Blogs
字串複製,可以使用 strcpy() 函式,若要複製字串中若干字元內容,則可以使用 strncpy() 。 1 2, char* strcpy( ...
#61. c語言中strcpy函式怎麼用看題 - 多學網
c 語言中strcpy函式怎麼用看題,1樓百度網友您好,輸出結果為a2yz 。 程式分析strcpy a 1 b 2 相當於將a 1 及它後面的內容複製為b 2 及它後.
#62. [分享] ptt C 語言新手十誡
但不能取代完整的學習,請自己好好研讀一兩本C 語言的好書,並多多實作練習。 ... 附加到s1 所指唯讀字串的後面, 造成寫入到程式無權碰觸的記憶體空間*/ strcat(s1, ...
#63. C語言中字符串函數後隱藏的危險陷阱 - 壹讀
C 語言沒有提供字符串類型,字符串以字符數組的形式出現,C標準庫提供了一些操作字符串的函數,主要有:strcmp 字符串比較函數,strcpy 字符串拷貝 ...
#64. C++有C 語言沒有的優勢—以帳號密碼辨別器為例作者
程式語言有很多種,其中C/C++為設計師最普遍使用的程式語言。其中. C++是以C 語言為基礎所發展出來的程式語言,它改進C 語言在系統的操. 作,使C++更有效率。
#65. [ C語言生活記事] - String 相關的function 系列文章阿鐵的碼農筆記
簡單實現C語言中有幾個string相關的function。 ... part 4 - strcat (string concatenate) ...繼續閱讀» · C · string. 2017-04-12 ...
#66. [C語言_02] 秒懂字串處理函數(上). 前情提要 - Medium
上一篇C語言談到了字元陣列與字串的一些區別,相信大家對字串都有一定的熟悉,因此這篇就來 ... gets, puts, fgets, fputs, strlen, strcpy, strncpy ...
#67. [C語言考題-1]strcpy()實作 - 寒石天地
[C語言考題-1]strcpy()實作. Question:已知strcpy函數的原型是 char* strcpy(char* strDest,const char* strSrc); 1.不使用原始函式庫,請實現strcpy ...
#68. C語言字符串函數大全
... c, ptr-string); else printf("The character was not found\n"); return 0; } 函數名: strcmp 功 能: 串比較 用 法: int strcmp(char *str1, ...
#69. c語言:如何將字串中指定的字元替換為另一個指定字元
1、首先,開啟C語言編譯器,新建一個初始.cpp檔案,例如:test.cpp。 ... 注意:一定要使用strcpy()函式等來操作方法c_str()返回的指標.
#70. c語言strcat源代碼- 極戶網
回答:關于c語言strcat源代碼的問題,我是這麽理解的, C語言中的字符串都以 ... 同時,C 語言提供了一strcat 來連接兩個字符串: char *strcat(char ...
#71. c語言strcat函數代碼 - 手機專題
回答:關于c語言strcat函數代碼的問題,我是這麽理解的, 四、連接字符串C 語言中使用庫函數strcat 來連接兩個字符串: char *strcat(char *dst,char ...
#72. String - 演算法筆記
動態配置節點,大可不必自己實作,可以直接使用malloc/free 、 new/delete 。 Compressed Trie. 去掉沒有分岔、呈一直線的節點。 去掉節點之後,字串資訊不完整,必須 ...
#73. 3-4-2 字串的指標陣列 - HTML網頁基礎語言
3-1 C語言的指標; 3-2 指標與陣列; 3-3 指標與結構; 3-4 指標與字串 ... 因為C語言的指標變數並沒有預設值,為了避免程式錯誤,例如:尚未指向其它變數的位址就使用 ...
#74. C語言字符串操作函數總結 - Linux教程網
用法: char * strcpy ( char * destination, const char * source );. 功能: 串拷貝(Copies the C string pointed by source into the array pointed ...
#75. char a 10 abc ,b 10 012 ,c 10 xyz strcyp a 1,b 2 puts ... - 優幫助
1樓:蘇曉圖. a2yz. 程式執行strcpy(a+1,b+2)後,字元陣列a的值為“a2”,再進行字串的連線strcat(a,c+1),此時字元陣列a的值為“a2yz”。 c語言中?:和!
#76. C語言中字符串常用函數strcat與strcpy的用法介紹 - 萬盛學電腦網
以下是對C語言中字符串常用函數strcat與strcpy的使用方法進行了詳細的分析介紹,需要的朋友可以參考下. strcpy原型聲明:extern char *strcpy(char* ...
#77. C語言字符串函數大全 - Ring's ACM - 痞客邦
strcat (destination, c); printf("%s\n", destination); return 0; } 函數名: strchr 功 能: 在一個串中查找給定字符的第一個匹配之處 用 法: char *strchr(char *str, ...
#78. 【C語言】include<string.h>常用函式 - 創作大廳
char *strcat(char *str1,const char *str2); 連接函式。 char *strcmp(char ... char *strchr(const char *str,int c);, 尋字函式,找第一個出現的。
#79. 字串 - 丁培毅
C 語言中採取第二種方式來表達字串, 而以string.lib 中一些函式來支援基本的字串運算, 例如:strcpy, strcat, strrev, strlen, strcmp 等等, 另外 ...
#80. C語言String.h函數內容筆記 - 繩繩的部落格
屬性類size_t strlen(const char *s);//取得字串長度回傳(直到\0) 複製類char *strcpy(char *str1, char *str2); // 將.
#81. strcpy c語言c語言strcpy()用法_diyun的博客-CSDN博客 - YHQ
const char * src ) Parameters dest– 這就是指針的內容將被… Strcpy 是C語言的函式之一,它可以複製以null 為結束字元的記憶體區塊到另一個記憶體區塊內。
#82. VB與C語言語法比較
VB與C語言語法比較. C. VB. PHP. 基本 資料型態. int, long int, float, double 無(0:False, Other:True) ... 2. strcat(string1, string2), &.
#83. [C 範例代碼] 基礎知識: 在指定位置後插入字符串 - 程式扎記
轉載自 這裡 前言: 歡迎來到二進位的世界。電腦資料都是以二進位儲存,想當然程式語言的變數也都是以二進位儲存。在C/C++ 當中有幾個位元運算子: << ...
#84. C 語言中的寬字串-- 包含Unicode - 陳鍾誠的網站
要在C 語言中使用Unicode 字串,假如您用的是gcc 編譯器或Linux,您可以使用寬字 ... strcat(), wcscat(), 字串連接. strcmp(), wcscmp(), 字串比較.
#85. 如何串連多個字串(c # 指南)
本文中的C# 範例會在Try.NET 內嵌程式碼執行器和測試區執行。 選取[執行]**** 按鈕以在互動式視窗中執行範例。 執行程式碼之後,您便可以修改它,並再選取 ...
#86. String類別
在C語言中提供兩種支援字串的方式. 1. 可以使用傳統以null結尾的字元陣列 ... 在C++中並不允許使用指定敘述將一字元陣列. 指定新值. 必須使用 ... strcat(s3,s2);.
#87. 10-3 字串的比較、尋找、代換、分解與結合
在C 語言中,strcmp 指令也用來作字串比較,但在兩字串相等時,回傳值是0,這和MATLAB 的strcmp 指令剛好相反。請特別小心! strncmp 指令用於比較字串的前n 個字元, ...
#88. 010 C 與C++ 的字串運算影片4 : C++ 教學進階 - YouTube
#89. 一、請問下列C 語言程式片段執行後,變數answer 的結果為何 ...
一、請問下列C 語言程式片段執行後,變數answer 的結果為何?(20 分) char s1[] = "Hello!"; char s2[] = "Nice to meet you!"; char s3[50]; int answer; strcpy(s3 ...
#90. [C語言] 字串相加(string_concat) - Jax 的工作紀錄
2009-04-24. [C語言] 字串相加(string_concat). strlen , strcpy , strcat
#91. C語言-如何將字元串接-急! - 藍色小舖
C 及C++ 語言沒有內建的字串類型, 你只能用字元陣列來模擬字串. ... 要把一個字串連接在另一個字串的後面, 可以用標準函式strcat(<指標1>, <指標2>).
#92. C語言中字串常用函數strcat與strcpy的用法介紹
以下是對C語言中字串常用函數strcat與strcpy的使用方法進行了詳細的分析介紹,需要的朋友可以參考下 strcpy原型聲明:extern char *strcpy(char* dest ...
#93. 【c语言】实现Strcat函数 - CSDN博客
实现char * my_strcat(char * dest,char *src)函数.返回: dest字符串的地址。功能:将src指向的字符串追加到dest指向字符串的后面。
#94. [C/C++基礎]- strstr:字串搜尋,strcat:合併,strcpy拷貝 - shiun ...
本篇要分享-純C語言strstr:字串搜尋,strcat:合併,strcpy拷貝_實作,有興趣的(C/P)同好,歡迎來(C/P)一下哈哈 ^ ^。
#95. C 語言學習筆記: 字串函數測試 - 小狐狸事務所
C 語言的字串處理需匯入string.h 函式庫, 其中常用的函式如下: ... strcat(dest, source), 將字串source 的內容串接到字串dest 後面並傳回dest 的位址.
#96. 如何在C++中間隔strcat? - 優文庫 - UWENKU
因此,這裏是我的代碼: #include #include using namespace std; const int MAX_SIZE1 = 20; const int MAX_SIZE2 = 10; int main() { char ...
#97. C語言基礎必修課(涵蓋「APCS大學程式設計先修檢測」試題詳解)(電子書)
函式功能說明 strcat 語法:char *strcat(char *str1, const char *str2)功能:將來源的 str2 字串連接至目地的 str1 陣列後面。但 str1 能容納的字元個數必須大於原來的 ...
strcat c實作 在 [轉錄] C 語言新手十誡(增修一版) - 看板SFFamily 的美食出口停車場
※ [本文轉錄自 C_and_CPP 看板]
作者: khoguan (Khoguan Phuann) 看板: C_and_CPP
標題: C 語言新手十誡(增修一版)
時間: Sat Sep 3 01:07:31 2005
C 語言新手十誡(The Ten Commandments for Newbie C Programmers)
by Khoguan Phuann
請注意:
(1) 本篇旨在提醒新手,避免初學常犯的錯誤(其實老手也常犯:-Q)。
但不能取代完整的學習,請自己好好研讀一兩本 C 語言的好書,
並多多實作練習。
(2) 強烈建議新手先看過此文再發問,你的問題極可能此文已經提出並
解答了。
(3) 以下所舉的錯誤例子如果在你的電腦上印出和正確例子相同的結果,
那只是不足為恃的一時僥倖。
(4) 不守十誡者,輕則執行結果的輸出數據錯誤,或是程式當掉,重則
引爆核彈、毀滅地球(如果你的 C 程式是用來控制核彈發射器的話)。
一、你不可以使用尚未給予適當初值的變數。
錯誤例子:
int accumulate(int max) /* 從 1 累加到 max,傳回結果 */
{
int sum; /* 未給予初值的區域變數,其內容值是垃圾 */
int num;
for (num = 1; num <= max; num++) {
sum += num;
}
return sum;
}
正確例子:
int accumulate(int max)
{
int sum = 0; /* 正確的賦予適當的初值 */
int num;
for (num = 1; num <= max; num++) {
sum += num;
}
return sum;
}
二、你不可以存取超過陣列既定範圍的空間。
錯誤例子:
int str[5];
int i;
for (i = 0; i <= 5; i++) str[i] = i;
正確例子:
int str[5];
int i;
for (i = 0; i < 5; i++) str[i] = i;
說明:宣告陣列時,所給的陣列元素個數值如果是 N, 那麼我們在後面
透過 [索引值] 存取其元素時,所能使用的索引值範圍是從 0 到 N-1,
也就是 C 和 C++ 的陣列元素是從第 0 個開始算起,最後一個元素的
索引值是 N-1, 不是 N。
C/C++ 為了執行效率,並不會自動檢查陣列索引值是否超過陣列邊界,
我們要自己寫程式來確保不會越界。一旦越界,將導致無法預期的後果。
三、你不可以提取(dereference)不知指向何方的指標(包含 null 指標)。
錯誤例子:
char *pc1; /* 未給予初值,不知指向何方 */
char *pc2 = 0; /* pc2 起始化為 null pointer */
*pc1 = 'a'; /* 將 'a' 寫到不知何方,錯誤 */
*pc2 = 'b'; /* 將 'b' 寫到「位址0」,錯誤 */
正確例子:
char c; /* c 的內容尚未起始化 */
char *pc1 = &c; /* pc1 指向字元變數 c */
/* 動態分配 10 個 char(其值未定),並將第一個char的位址賦值給 pc2 */
char *pc2 = (char *)malloc(10);
*pc1 = 'a'; /* c 的內容變為 'a' */
pc2[0] = 'b'; /* 動態配置來的第 0 個字元,內容變為 'b'
/* 最後記得 free() 掉 malloc() 所分配的空間 */
free(pc2);
說明:指標變數必需先指向某個明確的東西(object),才能進行操作。
四、你不可以將字串常數賦值(assign)給 char* 變數,然後透過該變數
改寫字串的內容(只能讀不能寫)。
錯誤例子:
char* pc = "john";
*pc = 'J';
printf("Hello, %s\n", pc);
正確例子:
char pc[] = "john";
*pc = 'J'; /* 或 pc[0] = 'J'; */
printf("Hello, %s\n", pc);
說明:字串常數的內容是唯讀的。上面的錯誤例子,是將其內容所在的位址賦
值給字元指標 pc, 我們透過指標只可以去讀該字串常數的內容,而不應該做
寫入的動作。而正確例子,則是另外宣告一個獨立的字元陣列,它的大小我們
未明文指定([]),編譯器會自動將其設為剛好可以容納後面的字串常數起始
值的大小,包括字串後面隱含的 '\0' 字元,並將字串常數的內容複製到字元
陣列中,因此可以自由的對該字元陣列的內容進行讀和寫。
錯誤例子(2):
char *s1 = "Hello, ";
char *s2 = "world!";
/* strcat() 不會另行配置空間,只會將資料附加到 s1 所指唯讀字串的後面,
造成寫入到程式無權碰觸的記憶體空間 */
char *s3 = strcat(s1, s2);
正確例子(2):
/* s1 宣告成陣列,並保留足夠空間存放後續要附加的內容 */
char s1[20] = "Hello, ";
char *s2 = "world!";
/* 因為 strcat() 的返回值等於第一個參數值,所以 s3 就不需要了 */
strcat(s1, s2);
五、你不可以對尚未分配所指空間的 char* 變數,進行(字串)陣列的相關操作。
其他型別的指標亦然。
錯誤例子:
char *name; /* name 尚未指向有效的空間 */
printf("Your name, please: ");
gets(name);
printf("Hello, %s\n", name);
正確例子(1):
/* 如果編譯期就能決定字串的最大空間,那就不要宣告成 char* 改用 char[] */
char name[21]; /* 字串最長 20 個字元,另加一個 '\0' */
printf("Your name, please: ");
gets(name);
printf("Hello, %s\n", name);
正確例子(2):
/* 若是在執行時期才能決定字串的最大空間,則需利用 malloc() 函式來動態
分配空間 */
size_t length;
char *name;
printf("請輸入字串的最大長度(含null字元): ");
scanf("%u", &length);
name = (char *)malloc(length);
printf("Your name, please: ");
scanf("%s", name);
printf("Hello, %s\n", name);
/* 最後記得 free() 掉 malloc() 所分配的空間 */
free(name);
注意:上例用 gets() 或 scanf() 來讀入字串,是不安全的。 因為這些函式
不會幫我們檢查使用者所輸入的字串長度是否超過我們所分配的 buffer 空間,
很可能會發生 buffer overflow。比較安全的做法是用 fgets() 來取代。如:
char *p;
char name[21];
printf("Your name, please: ");
fgets(name, sizeof(name), stdin);
/* fgets()會連行末的'\n'也讀進字串中,所以要找出存入'\n'的位置,填入 '\0'
if ((p = strchr(name, '\n')) != NULL)
*p = '\0';
printf("Hello, %s\n", name);
六、你不可以在函式中回傳一個指向區域性自動變數的指標。否則,會得到垃圾值。
[感謝 gocpp 網友提供程式例子]
錯誤例子:
char *getstr(char *name)
{
char buf[30] = "hello, "; /*將字串常數"hello, "的內容複製到buf陣列*/
strcat(buf, name);
return buf;
}
說明:區域性自動變數,將會在離開該區域時(本例中就是從getstr函式返回時)
被消滅,因此呼叫端得到的指標所指的字串內容就失效了。【不過,倒是可以從
函式中直接傳回字串常數,賦值給呼叫端的一個 const char * 變數,它既是唯
讀的(參見第四誡),同時也具有恒常的儲存期(static storage duration),其
內容將一直有效。】
正確例子:
void getstr(char buf[], int buflen, char const *name)
{
char const s[] = "hello, ";
assert(strlen(s) + strlen(name) < buflen);
strcpy(buf, s);
strcat(buf, name);
}
[針對字串操作,C++提供了更方便安全的 string class, 能用就盡量用]
#include <string>
using std::string;
string getstr(string const &name)
{
return string("hello, ") += name;
}
七、你不可以只做 malloc(), 而不做相應的 free(). 否則會造成記憶體漏失。
但若不是用 malloc() 所得到的記憶體,則不可以 free()。已經 free()了
所指記憶體的指標,在它指向另一塊有效的動態分配得來的空間之前,不可
以再被 free(),也不可以提取(dereference)這個指標。
[C++] 你不可以只做 new, 而不做相應的 delete.
八、你不可以在數值運算、賦值或比較中隨意混用不同型別的數值,而不謹慎考
慮數值型別轉換可能帶來的「意外驚喜」(錯愕)。必須隨時注意數值運算
的結果,其範圍是否會超出變數的型別。
錯誤例子(1):
unsigned int sum = 2000000000 + 2000000000; /* 20 億 */
double f = 10 / 3;
正確例子(1):
/* 全部都用 unsigned int, 注意數字後面的 u, 大寫 U 也成 */
unsigned int sum = 2000000000u + 2000000000u;
/* 或是用顯式的轉型 */
unsigned int sum = (unsigned int)2000000000 + 2000000000;
double f = 10.0 / 3.0;
說明:在目前最普遍的32位元PC作業平台上,整數常數2000000000的型別為
signed int(簡寫為 int),相加後,其結果仍為 int, 但是 signed int
放不下 4000000000, 造成算術溢位(arithmetic overflow),很可能無法
將正確的值指派給 unsigned int sum,縱使 unsigned int 放得下4000000000
的數值。注意:寫成
unsigned int sum = (unsigned int)(2000000000 + 2000000000);
也是不對的。
例子(2):(感謝 sekya 網友提供)
unsigned char a = 0x80;
char b = 0x80; /* implementation-defined result */
if( a == 0x80 ) { /* 恒真 */
printf( "a ok\n" );
if( b == 0x80 ) { /* 不一定恒真 */
printf( "b ok\n" );
}
說明:在將 char 型別定義為範圍從 -128 至 +127 的系統上,int 0x80
(其值等於 +128)要轉成 char 會放不下,會產生編譯器自行定義的值。
這樣的程式就不具可移植性了。
九、你不可以在一個運算式(expression)中,對一個基本型態的變數修改其值
超過一次以上。否則,將導致未定義的行為(undefined behavior)。
錯誤例子:
int i = 7;
int j = ++i + i++;
正確例子:
int i = 7;
int j = ++i;
j += i++;
你也不可以在一個運算式(expression)中,對一個基本型態的變數修改其值,
而且還在同一個式子的其他地方為了其他目的而存取該變數的值。(其他目的,
是指不是為了計算這個變數的新值的目的)。否則,將導致未定義的行為。
錯誤例子:
int arr[5];
int i = 0;
arr[i] = i++;
正確例子:
int arr[5];
int i = 0;
arr[i] = i;
i++;
[C++程式]
錯誤例子:
int i = 10;
cout << i << "==" << i++;
正確例子:
int i = 10;
cout << i << "==";
cout << i++;
十、你不可以在macro的定義中,不為它的參數個別加上括號。
錯誤例子:
#include <stdio.h>
#define SQUARE(x) (x * x)
int main()
{
printf("%d\n", SQUARE(10-5));
return 0;
}
正確例子:
#include <stdio.h>
#define SQUARE(x) ((x) * (x))
int main()
{
printf("%d\n", SQUARE(10-5));
return 0;
}
說明:如果是用 C++, 請多多利用 inline function 來取代上述的 macro,
以免除 macro 定義的種種危險性。如:
inline int square(int x) { return x * x; }
macro 定義出的「偽函式」至少缺乏下列數項函式本有的能力:
(1) 無法進行參數型別的檢查。
(2) 無法遞迴呼叫。
(3) 無法用 & 加在 macro name 之前,取得函式位址。
(4) 呼叫時往往不能使用具有 side effect 的引數。例如:
錯誤例子:(感謝 yaca 網友提供)
#define MACRO(x) (((x) * (x)) - ((x) * (x)))
int main()
{
int x = 3;
printf("%d\n", MACRO(++x));
return 0;
}
MACRO(++x) 展開來後變成 (((++x) * (++x)) - ((++x) * (++x)))
違反了第九誡。在 gcc 4.3.3 下的結果是 -24, 在 vc++ 下是 0.
後記:從「古時候」流傳下來一篇文章
"The Ten Commandments for C Programmers"(Annotated Edition)
by Henry Spencer
https://www.lysator.liu.se/c/ten-commandments.html
一方面它不是針對 C 的初學者,一方面它特意模仿中古英文
聖經的用語,寫得文謅謅。所以我現在另外寫了這篇,希望
能涵蓋最重要的觀念以及初學甚至老手最易犯的錯誤。
作者:潘科元(Khoguan Phuann) (c)2005. 感謝 ptt.cc BBS 的 C_and_CPP
看板眾多網友提供寶貴意見及程式實例。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.208.167
※ 編輯: khoguan 來自: 220.130.208.168 (11/03 01:24)
--
三月的柳絮不飛 妳的心如小小的寂寞的城
我達達的馬蹄是美麗的錯誤 我不是歸人 我是馬~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.96.120.11
... <看更多>