




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第八章 字符數(shù)據(jù)處理到現(xiàn)在為止,我們討論的主要是數(shù)值數(shù)據(jù)的表示和處理。本章將專門討論字符數(shù)據(jù)的表示與處理,如字符常量、字符串常量、字符變量、字符數(shù)組、字符數(shù)據(jù)的輸入輸出以及字符處理函數(shù)等。上一頁下一頁8.1 字符與字符串第三章已經(jīng)介紹了字符型數(shù)據(jù)的基本概念、表示方式和簡單的使用問題。這里再簡單回顧一下其主要知識點。字符型數(shù)據(jù)包括字符常量、轉(zhuǎn)義字符常量、字符串常量、字符變量和符號常量。字符常量:由單引號括起的單個字符。如:'a','A','G','?'。轉(zhuǎn)義字符常量:以反斜桿''開頭的特殊字符序列。意思是把反斜桿后面
2、的字符序列轉(zhuǎn)換成特定的含義,而不是原來的含義。例如:'n'表示換行,而不是小寫字母'n'。'r'表示回車;'b'表示退格;''表示''等等。字符串常量:用雙引號括起來的字符序列。例如,"China","12234"等。字符串常量的長度沒有限制,系統(tǒng)在字符串的末尾自動加上'0' ,以示字符串的結(jié)束。字符變量:存放字符常量的內(nèi)存變量。字符變量用關(guān)鍵字char來說明。可以在定義字符變量的同時進(jìn)行初始化。符號常量:以指定的符號代表其后的"一串
3、字符"。用于簡化程序的編寫和修改。以下程序段就是符號常量應(yīng)用例子。#define PAI 3.14#define N 10main( )int aN; /*等價于 int a10; */printf("%fn",PAI); /*等價于printf("%fn",3.14);*/printf("s=%fn",PAI*r*r); /*等價于printf("s=%fn",3.14*r*r);*/上一頁下一頁8.2 字符數(shù)組C語言中有字符常量和字符變量,有字符串常量,但沒有字符串變量。如何存儲字符串?C語言中可以用
4、字符數(shù)組存放字符串。字符數(shù)組中的各數(shù)組元素依次存放字符串的各字符,字符數(shù)組的數(shù)組名代表該數(shù)組的首地址。這為處理字符串中個別字符和引用整個字符串提供了極大的方便。一維字符數(shù)組的定義形式類似于一維數(shù)值數(shù)組的定義,只是數(shù)據(jù)類型改為char。例如:char a6,b10;定義的字符數(shù)組a具有6個數(shù)組元素,可以存放長度為5的字符串,最后一個數(shù)組元素存放字符串結(jié)束符'0'。b數(shù)組具有10個數(shù)組元素。注意,若定義的字符數(shù)組用來存放k個字符的字符串,則定義時字符數(shù)組元素的個數(shù)至少為k+1,一定要留一個數(shù)組元素存放字符串結(jié)束符'0'。否則,字符串沒有結(jié)束標(biāo)志,處理字符串時可能會出
5、現(xiàn)錯誤。上一頁下一頁8.3 字符串處理函數(shù)對字符的賦值、比較操作可以使用賦值運算符和關(guān)系運算符。例如:#include "stdio.h"main( ) char a,b;a='A'b=getchar( );if(a>b) printf("max=&cn",a);else printf("max=&cn",b);運行程序:輸入:h輸出:max=h對字符串的整體操作(如復(fù)制、比較、連接、計算字符串長度等),C語言沒有提供相應(yīng)的運算符,但以庫函數(shù)的形式實現(xiàn)了這些操作。在string.h文件中對這些函數(shù)
6、進(jìn)行了定義,用戶只要在程序的開頭加上命令行#include "string.h",就可以調(diào)用它們完成相應(yīng)的操作。要使字符變量ch的值為'A',可以采用賦值的方法:ch='A'。如果想使字符數(shù)組a中存放字符串"Beijing",有很多方法,如: 字符數(shù)組初始化 char a10 ="Beijing" 逐個字符輸入 for ( k=0; k<7; k+ )scanf ("%c",&ak);a7='0' 用字符串輸入函數(shù)輸入 gets(a); 用字符串復(fù)制函數(shù)
7、復(fù)制 strcpy(a,"Beijing");還可以采用例8-3所示的逐個字符復(fù)制的方法。注意,采用a="Beijing";的方法是錯誤的。因為"="左邊不能出現(xiàn)常量,數(shù)組名a是代表a數(shù)組首地址的地址常量,而不是變量。實際上,通過字符串復(fù)制函數(shù)來實現(xiàn)這個功能是十分方便的。 strcpy( )函數(shù)的調(diào)用形式:strcpy(s1,s2);功能: 把s2字符串復(fù)制到s1中。說明: s1是接受源字符串s2的存儲區(qū)首地址,形式上可以是字符數(shù)組名或字符指針。s2字符串在形式上可以是字符數(shù)組名或字符指針,也可以是字符串常量。注意,要保證s1存儲區(qū)能
8、容納下s2字符串。例如,char a6="China",b ="123"strcpy(a,b);strcpy(b,"ABC");puts(a);puts(b);輸出:123ABC若把strcpy(b,"ABC");改成strcpy(b,"Beijing");,則會出現(xiàn)意想不到的錯誤,因為b數(shù)組的長度只有3,字符串"Beijing"長度為7,就是說,有4個字符將占用其它存儲單元,從而破壞了其它變量的值。對這種錯誤,系統(tǒng)并不報錯。所以,一定要保證目標(biāo)存儲區(qū)足以存放源字符串。上一頁
9、下一頁8.4 二維字符數(shù)組二維數(shù)組可以看作一維數(shù)組,這個一維數(shù)組的每個數(shù)組元素也是一維數(shù)組。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;a數(shù)組可以看作一維數(shù)組,它有3個數(shù)組元素a0,a1,a2。而ai(i=0,1,2)本身也是一維數(shù)組,如a0是一維數(shù)組,a0是該數(shù)組的數(shù)組名,它的數(shù)組元素是a數(shù)組0行的4個元素:1,2,3,4。即二維數(shù)組的每一行都可以看作一維數(shù)組。二維字符數(shù)組的每一行也可以看作一維字符數(shù)組,即二維字符數(shù)組的每一行可以存放一個字符串。因此,可以利用二維字符數(shù)組存放多個字符串,于是二維字符數(shù)組又稱為字符串?dāng)?shù)組。二維字符數(shù)組的定義與二維數(shù)值數(shù)組的定義方
10、法相同,只是數(shù)據(jù)類型為char。char a25,b37;二維字符數(shù)組a有2行5列,每一行可以存放長度為4的字符串(最后1列用于存放字符串結(jié)束符),所以a數(shù)組可以存放2個字符串。b數(shù)組可以存放3個長度為6的字符串。上一頁下一頁8.5 應(yīng)用舉例例8-9:不使用字符串比較函數(shù)strcmp,自編程序,實現(xiàn)兩個字符串s1、s2的比較。#include "stdio.h"main( ) char s180,s280; int i=0,j;gets(s1); gets(s2);while(s1i&&s2i) /*比較每一對字符,直到出現(xiàn)'0'退出循環(huán) *
11、/if(s1i!=s2i) break; /* 若某一對字符不同,則已分出大小,退出循環(huán)*/i+;j= s1i-s2i; /* j>0s1>s2; j<0s1<s2; j=0s1=s2 */if(j>0) printf("%s>%sn",s1,s2);else if(j<0) printf("%s<%sn",s1,s2);else printf("%s=%sn",s1,s2);運行程序:輸入:chinachi123輸出:china>chi123程序中先在while循環(huán)中找到第一對不
12、同字符,然后依據(jù)兩個字符ASCII碼的差(j=s1i-s2i)來判斷它們的關(guān)系。j>0,則s1i>s2i,所以s1>s2;j<0,則s1i<s2i,所以s1<s2;j=0,則s1i=s2i,所以s1=s2。j相當(dāng)于庫函數(shù)strcmp(s1,s2)的返回值, 返回值大于0,s1>s2;返回值小于0,s1<s2;返回值等于0,s1和s2相等。本例中,兩個字符串的前3個字符相同,第4個字符不相同,因為'n'>'1',所以"china" > "chi123"。若s2字符串
13、改為"chinak",則前5個字符相同,第6個字符分別是'0'和'k',因為'0'的ASCII碼為0,所以'0'<'k',即"china"<"chinak"。僅當(dāng)兩個字符串完全一樣時,才能確定它們相等。例8-10:判斷s1字符串中是否包含s2字符串。例如"china123"包含"na12",但不包含"abc"。從s1字符串的第一個字符開始,依次與s2字符串的各字符比較,若均相同,則s1
14、包含s2。否則再從s1的下一個字符(第2個字符)開始,依次與s2字符串的各字符比較,。設(shè)k1,k2分別表示s1串和s2串的長度,則最后一次應(yīng)從s1的第k1-k2+1個字符開始(即s1k1-k2),依次與s2字符串的各字符比較,若存在不同字符,則s1肯定不包含s2。#include <stdio.h>main( ) char s180,s280; int i=0, j, k, k1, k2, f;gets(s1); gets(s2);k1=strlen(s1); k2=strlen(s2);f=0; /* 標(biāo)志量f=1,s2包含在s1中,f=0, s2不包含在s1中 */while
15、(i<k1-k2+1&&!f) /* 從s1串的s1i字符開始檢測s2是否包含在s1中 */ j=0;k=i;while(s2j&&s1k=s2j) /* 存在不同字符或s2包含在s1中時退出循環(huán) */ j+; k+;if (s2j='0') /* 若退出循環(huán)時,s2j='0',則s2串包含在s1串中 */ f=1;break; /* 確認(rèn)s2串包含在s1串中,f=1,退出循環(huán) */i+; /* 從s1的下一個字符開始繼續(xù)檢測 */if ( f=1 ) printf ("%s is in %sn",s2,
16、s1);else printf ("%s is not in %sn",s2,s1);例8-11:5個字符串按從小到大排序。建立二維字符數(shù)組s520,存放輸入的5個字符串。再建立一個一維數(shù)組a5,存放各字符串在s數(shù)組中的行號。排序時,需要進(jìn)行字符串交換位置時,并不交換它們在s數(shù)組中位置,而是交換a數(shù)組中相應(yīng)的行號。最后輸出排序結(jié)果時,按照a數(shù)組元素的順序,分別輸出相應(yīng)行號的字符串。如圖8-3所示。排序前,a數(shù)組中存放s數(shù)組各行字符串的行號,排序后,根據(jù)各行字符串的大小,從小到大地重排它們在a數(shù)組中的行號。例如"CHINA"是最小字符串,所以它的行號2存放
17、在a0,"SHORT"是最大字符串,故在a4存放它的行號3。#include "stdio.h"#include "string.h"main( ) char s580,a5;int i,j,k,m;for(i=0;i<5;i+) /* 輸入各字符串,并記錄它們的在S數(shù)組中的行號 */gets(si);ai=i;for(i=0;i<4;i+) /* 選擇法從小到大排序 */ k=i;for(j=i+1;j<5;j+)if(strcmp(sak,saj)>0) k=j; /*記錄當(dāng)前最小串的行號ak */if(k
18、!=i)m=ak; /*最小串的行號ak與ai交換位置*/ak=ai;ai=m;for(i=0;i<5;i+) /* 按排序后的行號ai輸出各字符串 */printf("%-sn",sai);運行程序:輸入:LONGINTCHARSHORTFLOAT輸出:CHARFLOATINTLONGSHORT例8-12:任意輸入一個3位整數(shù),取其各位數(shù)字的和,再取這個和數(shù)被7除的余數(shù),輸出余數(shù)對應(yīng)的星期(英文單詞)。例如,輸入123,(1+2+3)%7=6,則輸出saturday。對3位整數(shù)n,拆分其百、十和個位的方法是:百位: i=n/100;十位:j=n/10%10;個位:k
19、=n%10;其和數(shù)被7除的余數(shù)是:a=(i+j+k)%7,其結(jié)果必是0到6之間的整數(shù)。現(xiàn)在的問題是如何根據(jù)余數(shù)輸出對應(yīng)的星期英文單詞。建立一個7行9列的2維字符數(shù)組week,各行分別存放星期英文單詞。為了與余數(shù)對應(yīng),把星期日英文單詞存放到0行,星期一英文單詞存放到1行,。這樣,可以根據(jù)余數(shù),到相應(yīng)該余數(shù)的行,取出字符串輸出。如:輸入123,(1+2+3)%7=6,則輸出week數(shù)組的行號為6的字符串saturday。#include "stdio.h"main( ) char week79= "Sunday","Monday",&qu
20、ot;Tuesday","Wednsday","Thursday","Friday","Saturday"int i, j, k, a, n;do printf ("please input a number:n");scanf ("%d",&n); while ( n<100|n>999 ); /* 輸入一個3位整數(shù) */i=n/100; /* 分拆各位數(shù)字 */j=n/10%10;k=n%10;a=(i+j+k)%7; printf(&quo
21、t;n %d%d+%d+%dweek%d%sn",n,i,j,k,a,weeka);運行程序:please input a number:輸入:369輸出:3693+6+9week4Thursday上一頁下一頁本章小結(jié)本章討論了字符和字符串的表示與處理方法。如字符常量、字符變量、字符串常量和存放字符串的字符數(shù)組,還討論了字符串處理庫函數(shù)的用法以及字符數(shù)據(jù)的輸入輸出。字符常量是以單引號括起的單個字符,而字符串常量則是以雙引號括起的一串字符,并且系統(tǒng)自動在串尾加一字符串結(jié)束符'0';字符常量還可以用轉(zhuǎn)義字符或符號常量表示,前者以''打頭的字符序列表示特定字
22、符,而后者則以符號代表一串字符。字符變量只能存放一個字符,而字符數(shù)組則可以存放字符串。二維數(shù)組可以存放多個字符串(每行存放一個字符串)。處理多個字符串時(如求最大(小)字符串、字符串排序等),常用二維字符數(shù)組存放它們,對二維字符數(shù)組a,i行的字符串首地址是ai。以后學(xué)習(xí)指針數(shù)組后,用字符指針數(shù)組來處理多個字符串將更為方便。對數(shù)值的賦值、比較等運算符并不適用于字符串的相應(yīng)運算。C的庫函數(shù)提供了專門處理字符串的函數(shù)。例如字符串比較,if("ABC">"CDE")是錯誤的,應(yīng)寫成if(strcmp("abc","CDE&qu
23、ot;)>0);又如對字符數(shù)組a,采用a="123"是錯誤的操作,正確的方法是使用字符串復(fù)制函數(shù)strcpy(a,"123");字符串的輸出是從指定的地址開始輸出,直到遇字符串結(jié)束符'0'為止。因此,定義字符數(shù)組時,一定要預(yù)留一個數(shù)組元素存放'0'。輸入字符串時,要注意scanf( )函數(shù)不能輸入帶空格的字符串,應(yīng)采用gets( )函數(shù)。字符串處理函數(shù)為字符串操作提供了方便,應(yīng)正確掌握和使用它們。從學(xué)習(xí)編程的角度出發(fā),還應(yīng)自己試著編程實現(xiàn)這些函數(shù)的功能。上一頁下一頁習(xí)題八一、單選題8-1. 對以下程序從第一列開始輸入
24、數(shù)據(jù):2473, 程序的輸出結(jié)果是_。#include "stdio.h"main( ) int c;while(c=getchar( )!='n') switch(c-'2') case 0:case 1: putchar(c+4); case 2: putchar(c+4); break;case 3: putchar(c+3); default : putchar(c+2); A668977 B. 668966 C. 66778777 D. 66887668-2. 能正確進(jìn)行字符串賦值的是_。Achar s5='a',&
25、#39;e','i','o','u' B. char s5; s="good"C. char s5="abcd" D. char s5; s ="good"8-3. 不能正確為字符數(shù)組輸入數(shù)據(jù)的是_。Achar s5; scanf("%s",&s); B. char s5; scanf("%s",s);C. char s5; scanf("%s",&s0); D. char s5; gets(s);8-4
26、. 若有char a80,b80;則正確的是_。Aputs(a,b); B. printf("%s,%s",a ,b );C. putchar(a,b); D. puts(a);puts(b);8-5以下程序的輸出是_。main( )char a25="6937"',"8254" int i,j,s=0;for ( i = 0; i < 2; i+ )for ( j = 0; aij>'0' && aij<='9' j+=2 )s=10*s+aij-'0
27、'printf("s=%dn",s); A. 6385 B. 69825 C. 63825 D. 693825二、填空題8-6. 以下程序的輸出是_。main( ) char a34="abc","efg","hij" int k;for(k=1;k<3;k+) putchar(ak1);8-7. 以下程序的輸出是 。#include "string.h"main( ) char b30;strcpy (b,"GH"); strcpy(&b1,"
28、;DEF");strcpy (&b2,"ABC"); puts(b); 8-8. 以下程序的輸出是_。(表示空格,表示回車)#include "stdio.h"main( ) char a80,c='a' int j=0;scanf("%s",a);while(aj!='0') if (aj=c ) aj=aj-32;else if ( aj=c-32 ) aj=aj+32;j+;puts(a); 輸入:AhaMAAha8-9. 以下程序的輸出是 。#include "str
29、ing.h"main( ) char a80="AB",b80="LMNP" int j=0;strcat(a,b);while(aj+!='0') bj=aj;puts(b); 8-10. 以下程序的功能:從鍵盤上輸入一行字符,存入一個字符數(shù)組中,然后輸出該字符串。請?zhí)羁铡?include "ctype.h"#include "stdio.h"main( ) char str81; int i;for ( i=0; i<80; i+ ) stri = getchar( );if ( stri ='n' ) break;stri = _ ; i=0;while ( stri ) putchar( str_);8-11. 以下程序的功能:輸入10個字符串,找出每個字符串的最大字
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 外貿(mào)快遞銷毀方案范本
- 浙江移動充電樁施工方案
- 2024年項目管理盲點的識別與應(yīng)對試題及答案
- 項目管理流程優(yōu)化的試題及答案
- 2025年證券從業(yè)資格考試概覽試題及答案
- 文物鑒定估價方案范本
- 證券投資的風(fēng)險管理與控制考題及答案
- 2024年秘書證考試學(xué)習(xí)經(jīng)驗分享試題及答案
- 2024年項目管理專業(yè)考題及答案
- 2025年家庭理財規(guī)劃知識試題及答案
- 中國輸電線路在線監(jiān)測系統(tǒng)行業(yè)發(fā)展?fàn)顩r及前景規(guī)模調(diào)查報告2025-2030年
- 第18課《井岡翠竹》課件-2024-2025學(xué)年統(tǒng)編版語文七年級下冊
- 2025年河南林業(yè)職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 消防安全監(jiān)督與檢查要點
- 【MOOC】《思想道德與法治》(東南大學(xué))章節(jié)中國大學(xué)慕課答案
- 骨盆骨折圍手術(shù)期護(hù)理
- 2024年醫(yī)院職工獎懲辦法實施細(xì)則范例(3篇)
- 人教版小學(xué)數(shù)學(xué)三年級下冊《奧數(shù)競賽試卷》
- 2024年吉林省吉林市中考化學(xué)真題含解析
- 地鐵運營管理
- 現(xiàn)場巡檢與安全檢查管理制度
評論
0/150
提交評論