




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、數組嵌套:數組嵌套: N維數組:一維數組,元素為維數組:一維數組,元素為N-1維數組維數組 二維數組的行是一個一維數組:二維數組的行是一個一維數組: char nameMN; =name0,name1,nameM-1 namei:char型一維型一維N元素數組元素數組 name:二維數組首行地址,指向首行指針:二維數組首行地址,指向首行指針 namei:第:第i行首元素地址,指向首元素指針行首元素地址,指向首元素指針指針指針 基本類型:基本類型:type *p,元素指針,元素指針 復合類型:復合類型:type (*p)n,行指針,行指針1char Nchar Nchar Nchar N字符串(
2、字符串(Strings)2字符串:字符串: 字符數組字符數組 以特殊字符以特殊字符空字符(空字符(0)結尾)結尾字符串常量字符串常量 字面量字面量string constants,或者或者literals字符串變量字符串變量 string variablesC庫提供了用于操作字符串的一系列函庫提供了用于操作字符串的一系列函數數3字符串常量:雙引號括起來的字符序列字符串常量:雙引號括起來的字符序列When you come to a fork in the road, take it.可包含轉義序列可包含轉義序列CandynIs dandynBut liquornIs quicker.n -Og
3、den Nashn結果結果:CandyIs dandyBut liquorIs quicker. -Ogden Nash4編譯器遇到一個長度為編譯器遇到一個長度為n的字符串字面的字符串字面量時,分配量時,分配n+1個字節內存空間個字節內存空間空字符標志字符串結束空字符標志字符串結束 所有比特全為所有比特全為0的字節的字節 用轉義序列用轉義序列 0表示表示5字符串字面量字符串字面量 “abc” 存放如圖:存放如圖:以數組方式存儲,以數組方式存儲, (char 4)a,b,c,0 編譯器看作編譯器看作char * :指針:指針printf、scanf第一個參數第一個參數 字符串字面量字符串字面量
4、char *參數傳遞:參數傳遞: 字符串字面量地址,字符串字面量地址,eg:printf(abc); 6可在任何使用可在任何使用 char*指針的地方使用指針的地方使用字符串字面量字符串字面量char *p;p = abc;p指向字符串的第一個字符指向字符串的第一個字符7指針可添加下標指針可添加下標char ch;ch = abc1;/ch = b.把把0到到15轉換為等價轉換為等價16進制數字的函數進制數字的函數:char a16=0,1,F;給給i,求,求aichar digit_to_hex_char(int digit)return 0123456789ABCDEFdigit;80 0
5、1 12 23 34 45 56 67 78 89 91010111112121313141415150 01 12 23 34 45 56 67 78 89 9A AB BC CD DE EF F字符串字面量是常量字符串字面量是常量對字符串字面量的操作會導致未定義的對字符串字面量的操作會導致未定義的行為行為:char *p = abc;*p = d; /* WRONG */可修改可修改p,不可修改,不可修改*p9單字符的字符串字面量與一個字符常量單字符的字符串字面量與一個字符常量是不一樣的是不一樣的 “a” 是以指針表示是以指針表示 a 是以整數表示是以整數表示對對printf的合法調用為的
6、合法調用為printf(n);非法的調用非法的調用:printf(n); /* WRONG */10以空字符結尾的一維字符數組以空字符結尾的一維字符數組一維字符數組不一定是字符串一維字符數組不一定是字符串 有無空字符尾巴有無空字符尾巴求字符串長度求字符串長度搜索空字符搜索空字符11聲明字符串變量聲明字符串變量 字符數組:字符數組:char arrySTR_LEN; 確保給空字符留出空間,確保給空字符留出空間, 常見方法:采用常見方法:采用+1方式定義字符數組方式定義字符數組 char nameM+1; 字符串變量需存放字符串變量需存放80個字符,對應的字符數個字符,對應的字符數組必須聲明為組必
7、須聲明為80+1個個:#define STR_LEN 80char strSTR_LEN+1;字符串實際長度:字符串實際長度: 取決于字符串結束符的位置,長度為取決于字符串結束符的位置,長度為0到到STR_LEN12聲明同時初始化聲明同時初始化:char date18 = June 14; 編譯器自動增加一個空字符:編譯器自動增加一個空字符: “June 14” 不是字符串字面量,不是字符串字面量,而是初始化式而是初始化式J, u, n, e, , 1, 4, 0的縮的縮寫寫.13初始化式太短不能填滿整個字符串變量初始化式太短不能填滿整個字符串變量,編譯器會在后面增加額外的空字符,編譯器會在后
8、面增加額外的空字符: 補零補零(char)0=(int)0char date29 = June 14;表示為表示為:可忽略其長度,由編譯器來計算字符數可忽略其長度,由編譯器來計算字符數組的長度組的長度:char date4 = June 14;14聲明聲明date為一個數組:為一個數組:char date = “June 14”;/初始化初始化式式J聲明聲明date為一個指針:為一個指針:char *date = “June 14”;/字面量字面量均可作為一個字符串,存在區別:均可作為一個字符串,存在區別:數組版,字符可修改;指針版,字符串字數組版,字符可修改;指針版,字符串字面量不可修改面量
9、不可修改.數組版,數組版,date:數組名(地址不變);指:數組名(地址不變);指針版,針版,date可指向其它字符串的變量可指向其它字符串的變量.15聲明:聲明:char *p;/未初始化未初始化p0 = a;/wrong把把p作為字符串前,必須指向一個字符數作為字符串前,必須指向一個字符數組組.做法做法1:使:使p指向字符串變量指向字符串變量:char strSTR_LEN+1, *p = str;做法做法2:使:使p指向動態分配的字符串指向動態分配的字符串p = malloc(STR_LEN+1);void *malloc(size_t size)/分配分配size字節,字節,返回首地址
10、返回首地址16寫(輸出):寫(輸出):printf 或者或者 puts.讀字符串:讀字符串:scanf或者或者gets17Printf函數用函數用 %s 轉換說明符來寫一轉換說明符來寫一個字符串個字符串:char str = Are we having fun yet?;printf(%sn, str);輸出為:輸出為:Are we having fun yet?printf逐字符寫字符串,直至遇到空逐字符寫字符串,直至遇到空字符字符.18轉換說明符轉換說明符%.ps 輸出部分字符串輸出部分字符串. p表示要顯示的字符的個數表示要顯示的字符的個數.語句:語句:printf(%.6sn, str
11、);顯示顯示Are we 19puts函數用于寫字符串函數用于寫字符串:puts(str);寫完字符串后,寫完字符串后, puts函數會自動換行函數會自動換行20Scanf函數用函數用%s 轉換說明符讀字符到轉換說明符讀字符到一個字符數組一個字符數組:scanf(%s, str);str是字符串(數組),不必放置是字符串(數組),不必放置&.scanf函數會存放一個空字符在字符串函數會存放一個空字符在字符串的后面的后面21scanf遇換行遇換行符、空白和符、空白和tab符停止讀取符停止讀取讀取整行輸入用讀取整行輸入用gets函數函數,特點特點: 讀取輸入不會跳過開始的空白讀取輸入不會跳
12、過開始的空白. 讀到換行符才停止讀入讀到換行符才停止讀入. 不存儲新行符,而用空字符代替,等價于:不存儲新行符,而用空字符代替,等價于:i=0;while(ch= getchar()!=n)stri+ = ch;stri=0;22程序片段程序片段:char sentenceSENT_LEN+1;printf(Enter a sentence:n);scanf(%s, sentence);輸入:輸入:To C, or not to C: that is the question.sentence = “To”.gets(sentence);sentence = “To C, or not to
13、C: that is the question.”23scanf、gets不檢查目標存儲空間是不檢查目標存儲空間是否存滿,否存滿,可能造成數組越界,導致未定義的行為可能造成數組越界,導致未定義的行為解決方法:解決方法: scanf通過轉換說明符通過轉換說明符%ns來在一定程度來在一定程度上避免上述問題上避免上述問題. n指明能夠存放的最多字符數指明能夠存放的最多字符數. gets本身不安全;本身不安全;fgets是一個更好的替是一個更好的替代代. 24scanf,gets不夠靈活且有風險不夠靈活且有風險程序員常編寫自己的輸入函數程序員常編寫自己的輸入函數.需考慮的問題:需考慮的問題: 是否跳過
14、開頭空白是否跳過開頭空白? 怎么停止怎么停止: 換行符、空白字符或者其它字符換行符、空白字符或者其它字符? 該字符是存放到字符串還是丟棄該字符是存放到字符串還是丟棄? 是否檢測長度,超長怎么處理:是否檢測長度,超長怎么處理: 丟棄額外的字符或者留給下一次輸入操作?丟棄額外的字符或者留給下一次輸入操作?25假如我們需要函數:假如我們需要函數: (1) 不跳過開始的空白字符不跳過開始的空白字符, (2) 讀到第一個換行符則停止(不存入字讀到第一個換行符則停止(不存入字符串)符串) (3) 舍棄額外的字符舍棄額外的字符.該函數的一種原型為:該函數的一種原型為:int read_line(char s
15、tr, int n);26循環調用循環調用 getchar來實現來實現:int read_line(char str, int n) int ch, i = 0; while (ch = getchar() != n) if (i =len) break;/return or exit?ni=ch;i+;int main()char nameL=張三張三;puts(name); puts(你叫啥子名字?你叫啥子名字?n);getname(name,L);puts(我叫李四我叫李四n);return 0;Copyright 2008 W. W. Norton & Company.All
16、rights reserved.34要求:要求: 二維數組存放學生名單,函數實現名單倒二維數組存放學生名單,函數實現名單倒序,和名字插入序,和名字插入approach: 1. 二維數組存放學生姓名二維數組存放學生姓名 2. 函數函數input錄入名單錄入名單 3. 函數函數output顯示名單顯示名單 4. 函數函數rev實現名單顛倒實現名單顛倒 5. 函數函數insert實現名字插入實現名字插入Copyright 2008 W. W. Norton & Company.All rights reserved.35#define NUM 10/名單長度名單長度#define LEN 1
17、1/名字長度名字長度void input(char LEN+1, int);void output(char LEN+1,int);void rev(char LEN+1,int);void insert(char LEN+1,int, char *,int);int main()char nameNUMLEN+1=Tom,Mike,Bob,Alice,Jack;/memset(name,0,NUM*LEN)char n1=“Smith”;/input(name, 5);/output(name, 5);rev(name, 5);output(name, 5);insert(name, 5,n
18、1,3);output(name, 6);return 0;36void input(char nLEN+1, int len) /n:形式名單,:形式名單,len:名單長度:名單長度int i;char ch;for(i=0;i=LEN) break;nij+ = ch;nij=0;void output(char nLEN+1, int len)int i;puts(the name list as follow:n);for(i=0;ilen;i+)puts(ni);37void rev(char nLEN+1, int len)int i,j;char tempLEN+1;for(i=
19、0;ilen/2;i+)/0len-1,1len-2(-1-1),ilen-1-ifor(j=0;j3;i-)/ni-1-ni for(j=0;jLEN;j+) nij=ni-1j;/搬遷就緒搬遷就緒for(j=0;jLEN;j+) n3j=n1j; s390ilen-1len字符串作為數組處理(本質:字符數組)字符串作為數組處理(本質:字符數組)不能直接拷貝(賦值)和比較不能直接拷貝(賦值)和比較char str110, str210;str1 = abc; str2 = str1;if (str1 = str2) 怎么辦?怎么辦?賦值:賦值:for(i=0;i10;i+) str2i=st
20、r1i;比較:比較:for(bool eq=true,int i=0;i10;i+) if(str1i!=str2i)eq = false;break;40C函數庫提供了豐富的函數用于完成數組函數庫提供了豐富的函數用于完成數組的操作的操作.#include 函數以字符串為形式參數:函數以字符串為形式參數:類型類型char *:實際參數:實際參數:字符數組字符數組char指針指針字符串字面量字符串字面量在后面的例子中,假設在后面的例子中,假設char str1,str2.41strcpy 函數原型函數原型:char *strcpy(char *s1, const char *s2);拷貝字符串拷
21、貝字符串s2到字符串到字符串s1,返回,返回s1strcpy(str2, abcd);/* str2 now contains abcd */strcpy(str1, str2);/* str1 now contains abcd */str2長于長于str1,未定義行為,未定義行為42字符串常量字符串常量(字面量)(字面量)”字符序列字符序列” “how are you, guys” “abc” 以字符數組方式存放:以字符數組方式存放: 以空字符以空字符0結尾結尾字符常變量字符常變量以空字符結尾的一維字以空字符結尾的一維字符數組符數組43聲明為數組:聲明為數組:char date = “Ju
22、ne 14”;聲明為指針聲明為指針 :char *date = “June 14”;44char *p;/必須指向一個字符串必須指向一個字符串做法做法1:指向字符串變量:指向字符串變量:char strSTR_LEN+1, *p=str;做法做法2:指向動態分配空間:指向動態分配空間:p = malloc(STR_LEN+1);處理鏈表,解決數組大小固定的問題處理鏈表,解決數組大小固定的問題45循環逐個訪問字符串字符循環逐個訪問字符串字符數組版:數組版:char strLEN+1;for(i=0;stri!=0;i+)stri指針版:指針版:char *p=str;for(;*p != 0;p
23、+)*p46strcpy(str1, str2);strncpy:較慢但安全較慢但安全.原型:原型:c-free CC+庫函數參考庫函數參考strncpy(str1, str2, sizeof(str1);隱憂:隱憂:str1結束符問題結束符問題更安全的方式更安全的方式:strncpy(str1, str2, sizeof(str1) - 1);str1sizeof(str1)-1 = 0;保證保證str1總是以空字符結尾的總是以空字符結尾的.47函數原型函數原型:size_t strlen(const char *s);返回字符串返回字符串s的長度,不包括空字符的長度,不包括空字符.int
24、len;len = strlen(abc); /*3*/len = strlen(); /*0*/strcpy(str1, abc);len = strlen(str1); /*3*/len=sizeof(str1)?48函數原型函數原型:char *strcat(char *s1, const char *s2);追加追加s2的內容到的內容到s1末尾,返回末尾,返回s1:strcpy(str1, abc);strcat(str1, def);/*str1 now contains abcdef */strcpy(str1, abc);strcpy(str2, def);strcat(str1
25、, str2);/* str1 now contains abcdef */ 49str1數組應足夠長,以容納數組應足夠長,以容納str1+str2的內容,否則導致未定義的內容,否則導致未定義的行為的行為.Strncat 第三個參數第三個參數(int):限制要拷貝的字符數:限制要拷貝的字符數 安全但較慢版本安全但較慢版本.調用:調用:strncat(str1, str2, sizeof(str1) - strlen(str1) - 1);50函數原型:函數原型:int strcmp(const char *s1, const char *s2);返回:返回:小于小于0:s1s2測試測試str1
26、是否小于是否小于 str2:if (strcmp(str1, str2) 0測試測試 str1 是否小于或者等于是否小于或者等于 str2:if (strcmp(str1, str2) = 0)51比較實質:逐字符比較比較實質:逐字符比較ASCII碼碼 uestc vs ustcs1小于小于s2: s1、s2前前i個字符相同,但個字符相同,但s1第第(i+1)個個字符小于字符小于s2第第(i+1)個字符個字符 “abc”小于小于”bcd”,“abd”小于小于“abe”; s1的所有字符都匹配的所有字符都匹配s2, 但是但是s1比比s2短短(空字符與(空字符與s2其余字符比)其余字符比). “a
27、bc”小于小于”abcd”52Enter day and reminder: 24 Susans birthdayEnter day and reminder: 5 6:00 - Dinner with Marge and RussEnter day and reminder: 26 Movie - ChinatownEnter day and reminder: 7 10:30 - Dental appointmentEnter day and reminder: 12 Movie - Dazed and ConfusedEnter day and reminder: 5 Saturday
28、classEnter day and reminder: 12 Saturday classEnter day and reminder: 0 Day Reminder 5 Saturday class 5 6:00 - Dinner with Marge and Russ 7 10:30 - Dental appointment 12 Saturday class 12 Movie - Dazed and Confused“ 24 Susans birthday 26 Movie - Chinatown53Overall strategy: 分別讀日期和提醒,并組合字符串分別讀日期和提醒,并
29、組合字符串 scanf(%2d, &day); read_line(); sprintf(day_str, %2d, day); 按日期順序存入二維字符數組按日期順序存入二維字符數組 顯示顯示54char *strcpy(char *s1, const char *s2);strncpy(str1, str2, sizeof(str1) - 1);size_t strlen(const char *s);char *strcat(char *s1, const char *s2);strncat(str1, str2, sizeof(str1) - strlen(str1) - 1);
30、int strcmp(const char *s1, const char *s2);55remind.c /* Prints a one-month reminder list */ #include #include #define MAX_REMIND 50 /*maximum number of reminders */#define MSG_LEN 60 /*max length of reminder message*/ int read_line(char str, int n); int main(void) char remindersMAX_REMINDMSG_LEN+3;
31、 char day_str3, msg_strMSG_LEN+1; int day, i, j, num_remind = 0; for (;) if (num_remind = MAX_REMIND) printf(- No space left -n); break; 56 printf(Enter day and reminder: ); scanf(%2d, &day); if (day = 0) break; sprintf(day_str, “%2d”, day);/補空格補空格 read_line(msg_str, MSG_LEN); for (i = 0; i num_
32、remind; i+)/定位定位 if (strcmp(day_str, remindersi) i; j-)/移動移動 strcpy(remindersj, remindersj-1); strcpy(remindersi, day_str); strcat(remindersi, msg_str); num_remind+; printf(nDay Remindern); for (i = 0; i num_remind; i+) printf( %sn, remindersi); return 0;575 Saturday class5 Saturday class5 6:00 - Di
33、nner with Marge and Russ7 10:30 - Dental appointment24 Susans birthday26 Movie - Chinatown12 Saturday classSaturday class數-符12int read_line(char str, int n) int ch, i = 0; while (ch = getchar() != n) if (i n) stri+ = ch; stri = 0; return i;58處理字符串的函數是特別豐富的慣用法處理字符串的函數是特別豐富的慣用法資源資源.下面將會探索其中兩種最著名的慣用法下面
34、將會探索其中兩種最著名的慣用法,并利用它們編寫,并利用它們編寫strlen函數和函數和 strcat函數函數.59累計字符串長度累計字符串長度:size_t strlen(const char *s) size_t n; for (n = 0; *s != 0; s+) n+; return n;size_t:標準:標準C庫中定義,庫中定義,應為應為unsigned int,在在64位系統中為位系統中為 long unsigned int。60搜索搜索s1結尾的空字符,并用結尾的空字符,并用p指向它指向它從從s2逐個復制字符到逐個復制字符到p指向的位置指向的位置61p最初指向最初指向s1的首字
35、符的首字符:p=s162while定位定位s1結尾空字符,結尾空字符,p指向它:指向它:while(*p!=0) p+;while逐個復制逐個復制s2指向的字符到指向的字符到p指向指向的地方,接著的地方,接著p和和s2都進行自增都進行自增*p = *s2;p+;s2+;第一次循環后的樣子第一次循環后的樣子:63當當s2指向空字符的時候,循環終止指向空字符的時候,循環終止:while (*s2 != 0) 在在p所指向的位置放置空字符,所指向的位置放置空字符,*p = 0;64char *strcat(char *s1, const char *s2) char *p = s1; while (
36、*p != 0) p+; while (*s2 != 0) *p = *s2; p+; s2+; *p = 0; return s1;65存儲字符串數組最佳方式:二維字符數存儲字符串數組最佳方式:二維字符數組,每行一個字符串組,每行一個字符串:char planets8 = Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto;可以忽略數組的行數,但是必須指明數可以忽略數組的行數,但是必須指明數組的列數組的列數.66字符串長短不一字符串長短不一planets數組存在未用空白(額外的數組存在未用空白(額外的空字符
37、空字符):67為節省空間,構造參差不齊的數組為節省空間,構造參差不齊的數組(ragged array)指針數組指針數組:char *planets = Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto;:初始化式:初始化式“”:字符串字面量:字符串字面量planets0=“Mercury”char (*planets)68planets的存儲的存儲:69planets下標下標訪問某行星名字訪問某行星名字搜索并顯示以字母搜索并顯示以字母M開頭的字符串為開頭的字符串為:for (i = 0; i 9; i+) if (planetsi0 = M) printf(%s begins w
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西北政法本科生教務管理系統
- 自動化生產單元項目投資風險評估報告
- 計算機成人教育畢業論文
- 護理美學與禮儀課件
- 2020年高血壓護理個案講課件
- 2025-2030年中國高級裝飾行業市場深度調研及競爭格局與投資策略研究報告
- 2025-2030年中國面包香精行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年中國防水涂料行業市場深度調研及前景趨勢與投資研究報告
- 2025-2030年中國重建關節置換行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年中國鄰甲酚(CAS95487)行業市場現狀供需分析及投資評估規劃分析研究報告
- 河北秦皇島事業單位招聘中小學教師類D類考試模擬題帶答案2024年
- T-ZZB 2218-2021 燃氣用具脈沖點火器
- 好讀書讀好書課件
- 以科技創新為導向的醫療人才培養計劃
- 《中華人民共和國公務員法概述》課件
- 2025年ASQ質量經理(CMQ.OE)認證考試練習題庫(350題)
- 裝修驗房合同協議
- 專業市場營銷咨詢服務合同
- 企業信息管理制度
- 2025屆湖南省邵陽市邵東縣中考生物押題卷含解析
- 水表檢定記錄全冊
評論
0/150
提交評論