第07章字符串及其應(yīng)用(12級)_第1頁
第07章字符串及其應(yīng)用(12級)_第2頁
第07章字符串及其應(yīng)用(12級)_第3頁
第07章字符串及其應(yīng)用(12級)_第4頁
第07章字符串及其應(yīng)用(12級)_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

程序設(shè)計技術(shù)C語言數(shù)據(jù)描述和C程序設(shè)計初步

結(jié)構(gòu)化程序設(shè)計基礎(chǔ)和C語言的控制結(jié)構(gòu)

數(shù)組及其應(yīng)用

函數(shù)與C程序結(jié)構(gòu)

指針與函數(shù)

指針與數(shù)組

字符串及其應(yīng)用結(jié)構(gòu)體類型和聯(lián)合體類型C語言的文件處理及其應(yīng)用位運算與枚舉類型字符串及其應(yīng)用C語言的字符串表示方法字符串的常用處理方法及標準庫函數(shù)

字符串的表示方法有兩種

因為c語言中沒有字符串這種數(shù)據(jù)類型,只有字符串常量,沒有字符串變量,所以對字符串的處理一般采用兩種方法:利用字符數(shù)組利用指向字符變量的指針(串指針)

7.1.1字符串表示方法一般的字符數(shù)組一個一個存放字符數(shù)據(jù)的數(shù)組就稱為字符數(shù)組,可使用字符數(shù)組實現(xiàn)對字符串的處理。字符數(shù)組的定義:char數(shù)組名[長度]

例如:charstr[7]={’a’,’b’,’c’,’d’,’e’,’f’,’g’};

abcdefgstr圖7.2數(shù)組名與其初始化值之間的對應(yīng)關(guān)系又如:charstr[7]={’a’,’b’,’c’,’d’,’e’};abcde\0\0str圖7.2數(shù)組名與其初始化值之間的對應(yīng)關(guān)系7.1.1字符串表示方法用字符數(shù)組處理字符串時

字符數(shù)組的定義:char數(shù)組名[長度]

注意:存放字符串時要使用空字符’\0’作為字符串的結(jié)束符號,所以定義字符數(shù)組處理字符串時,應(yīng)使字符數(shù)組長度大于或等于字符串的有效長度加1。例如:charstr[7]=”abcdef”;

abcdef\0str圖7.2數(shù)組名與其初始化值之間的對應(yīng)關(guān)系7.1.1字符串表示方法指向字符變量的指針(串指針)

定義字符指針變量,并將字符串或字符串常量的首地址賦給該指針變量。即字符指針變量指向一個字符串。例如:char*sPtr=“abcd”;

sPtr=“1234”;

系統(tǒng)內(nèi)存會分配一段連續(xù)的存儲區(qū)域來存放指定的字符串常量,然后將該存儲區(qū)域的起始地址(字符串常量的首地址)賦值給字符指針變量sPtr。第2個賦值語句sPtr=”1234”;使指針變量sPtr由指向字符串”abcd”改為指向字符串”1234”。

abcd\0sPtra)指針變量指向字符串常量abcd\0abcd\0sPtrb)指針變量改變原指向指向另一字符串1234\0圖7.1指針變量與字符串數(shù)據(jù)對象的關(guān)系示意圖7.1.1字符串表示方法chars1[]=“abcd”;char*s2=“abcd”;chars1[10],*s2;s1=“abcd”;s2=“abcd”;

比較chars1[10],*s2;gets(s1);gets(s2);char*s2;s2=(char*)malloc(10);gets(s2);比較

字符數(shù)組與字符指針的區(qū)別7.1.1字符串表示方法XX7.1.2字符串的輸入輸出使用scanf、printf函數(shù)⑴使用格式控制符%c可以通過單個字符方式輸入輸出字符數(shù)組。(chara[6],b[8],c[5];)

for(i=0;i<6;i++)scanf(“%c”,&a[i]);for(i=0;i<6;i++)printf(“%c”,a[i]);⑵使用格式控制符%s可以將整個字符串一次輸入輸出,并且一次可以輸入輸出多個字符串。(函數(shù)參數(shù)為字符數(shù)組名或串指針)

scanf(“%s”,a);/*整體輸入一個字符串*/

printf(“%s”,a);/*整體輸出一個字符串*/使用gets、puts函數(shù)

(函數(shù)參數(shù)為字符數(shù)組名或串指針)使用gets和puts函數(shù)一次可以輸入輸出一個字符串。7.1.2字符串的輸入輸出scanf和gets函數(shù)的區(qū)別一次調(diào)用能夠輸入的字符串個數(shù)不同gets(a);/*輸入1個字符串*/scanf(“%s%s%s”,a,b,c);/*輸入多個字符串(空格分隔)*/空格字符的處理不同

gets

輸入字符串中可含有空格字符。

scanf

輸入字符串中不能含空格字符(難以得到預(yù)期結(jié)果)。printf和puts函數(shù)的區(qū)別一次調(diào)用能夠輸出的字符串個數(shù)不同

puts(a);/*輸出1個字符串*/

printf(“%s\n%s\n%s”,a,b,c);/*輸出多個字符串*/輸出數(shù)據(jù)換行處理方式不同

puts函數(shù)輸出字符串后會自動換行;

printf函數(shù)輸出字符串后不自動換行;

gets(a);abcdegets(b);1234gets(c);GDASputs(a);puts(b);puts(c);abcde1234GDASGDAS就被截掉了。例7-2

將字符串中小寫字母轉(zhuǎn)變成大寫字母#include<stdio.h>voidmain(){ charstring[100],*p; printf("Pleaseinputastring:"); gets(string);

p=string; while(*p!='\0') {if(*p>='a'&&*p<='z') *p-=32;

p++; } printf("Thenewstringis:"); puts(string);}7.1.2字符串的輸入輸出例7-2程序演示

pabcdefg\0stringP*pAB*ppCDEFG字符串及其應(yīng)用C語言的字符串表示方法字符串的常用處理方法及標準庫函數(shù)字符串的常用處理方法及標準庫函數(shù)字符串中有效字符的統(tǒng)計字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2.1字符串中有效字符的統(tǒng)計測試字符串的長度

統(tǒng)計字符串中包含的有效字符個數(shù)。即從字符串的第一個字符開始,依次向后判斷該字符是否字符串結(jié)束符’\0’,若不是則予以統(tǒng)計,直到遇到’\0’為止。標準測試字符串長度函數(shù)strlen

函數(shù)原型:在<string.h>中

size_tstrlen(constchar*string)

其中:size_t表示無符號整數(shù)數(shù)據(jù)類型函數(shù)調(diào)用:strlen(str);功能:測試str的字符串長度。返回值為字符串的實際長度,不包括結(jié)束字符’\0’。a[]a

參數(shù)應(yīng)該是個地址,如:數(shù)組名或串指針等。47.2.1字符串中有效字符的統(tǒng)計(P218)例7-5編程序?qū)崿F(xiàn)功能:判斷輸入字符串是否回文。

回文:左讀或右讀都相同。如:level是回文。level\0wordfor(;head<end;head++,end--) if(*head!=*end) { flag=0; break; }if(flag)printf("%s是回文!",word);elseprintf("%s不是回文!",word);headendheadendabcde\0headendgets(word);len=strlen(word);head=word;end=head+len-1字符串的常用處理方法及標準庫函數(shù)字符串中有效字符的統(tǒng)計字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2.2字符串的復(fù)制標準字符串復(fù)制函數(shù)strcpy

函數(shù)原型:在<string.h>中

char*strcpy(char*strDestination,const*strSource)

函數(shù)調(diào)用:strcpy(str1,str2);

功能:將字符串str2拷貝到字符串str1中,函數(shù)返回字符串str1。其中,字符數(shù)組str1必須定義足夠大,str2可以是字符串常量。

返回值是個地址兩個參數(shù)也是地址源字符串目標字符串例7-7使用標準函數(shù)strcpy實現(xiàn)字符串的拷貝*s1,*s2;該指針懸空,出錯!使用標準字符串復(fù)制函數(shù)的注意點字符串復(fù)制函數(shù)使用的字符數(shù)組形參本質(zhì)上是一個指針量,對應(yīng)的實參必須是地址量(數(shù)組名或已經(jīng)指向某串的串指針等)??梢詫崊⒆址麛?shù)組(字符串)的部分提供給形參數(shù)組共享。字符串存儲時,系統(tǒng)會自動添加字符串結(jié)束符’\0’,程序處理字符串時,只需指出開始位置。7.2.2字符串的復(fù)制

例7-8

編程將源字符串從指定位置拷貝到目標字符串

#include<stdio.h>#include<string.h>voidmain()

{ chars1[80],s2[80]; intpos; printf("Inputthestrings1:"); gets(s1); printf("Inputthepos:"); scanf("%d",&pos); strcpy(s2,&s1[pos]);//strcpy(s2,s1+pos); puts(s2);}7.2.2字符串的復(fù)制abcde\0s1s222s1+2(&s1[2])cde\07.2.2字符串的復(fù)制voidmain(){ chars[100]; intstart,len,length; gets(s); scanf("%d",&start);scanf("%d",&length); len=strlen(&s[start]); if(len<length) strcpy(s+start,s+strlen(s)); else strcpy(s+start,s+start+length); puts(s);}P221例7-9

演示abcmnkdef\0s

def\0

37Len=636s+6s+3633字符串的常用處理方法及標準庫函數(shù)字符串中有效字符的統(tǒng)計字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2.3字符串的連接字符串連接的基本思想首先找到目標字符串的結(jié)尾處,然后從源字符串的第一個字符開始依次取出每一個有效字符賦值到指定目標位置,直到源字符串的字符處理完為止。標準字符串連接函數(shù)strcat

函數(shù)原型:

char*strcat(char*strDestination,char*strSource);函數(shù)調(diào)用:strcat(str1,str2);

功能:將字符串str2連接到字符串str1的后面生成新的字符串str1,函數(shù)返回字符串str1。字符數(shù)組長度應(yīng)足夠大(大于或等于strlen(str1)+strlen(str2))。

例7-12

編程將源字符串從指定位置連接到目標字符串a(chǎn)bcdABCDefg4abcdefg4字符串的常用處理方法及標準庫函數(shù)字符串中有效字符的統(tǒng)計字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2.4字符串中字符的查找

基本思想:字符串中字符的查找就是按照指定方向?qū)ふ抑付ㄗ址谝淮卧谧址谐霈F(xiàn)的位置。從查找方向分為正向查找(從串首至串尾)反向查找(從串尾至串首)從獲取被查找字符位置信息分為返回下標序號方式(自定義函數(shù)才能實現(xiàn))返回存放地址方式(調(diào)用標準函數(shù)實現(xiàn))標準字符查找函數(shù)strchr

函數(shù)原型:

char*strchr(constchar*string,intc);

函數(shù)調(diào)用:

strchr(str,ch);

函數(shù)功能:

正向在字符串str中查找字符ch,若ch存在則返回其在字符串中首次出現(xiàn)的地址,否則返回NULL。7.2.4字符串中字符的查找7.2.4字符串中字符的查找函數(shù):返回被查找字符在串中的下標序號intsearch_chr(chars[],charc){ inti; for(i=0;s[i]!='\0';i++) if(s[i]==c) returni; return-1;}例7-13

編制函數(shù)實現(xiàn)功能:在字符串中正向查找指定字符,并用主函數(shù)測試。

函數(shù):返回被查找字符在串中的存放地址char*search_chr(chars[],charc){ inti=0; for(;s[i]!='\0';i++) if(s[i]==c) return&s[i]; returnNULL;}7.2.4字符串中字符的查找for(i=0,j=0;s1[i]!='\0';i++){pos=search_chr(s2,s1[i]); if(pos!=NULL&&search_chr(s3,s1[i])==NULL){s3[j++]=s1[i]; s3[j]='\0'; }}

例7-14

(P226)編程序?qū)崿F(xiàn)功能:利用上面設(shè)計的字符查找函數(shù)求兩個字符串中共同具有的字符并將這些字符組成第三個字符串,注意相同字符只能取一次。在第3個串中只保存一個相同字符的條件acdfga\0adshg\0s1s2s3字符串的常用處理方法及標準庫函數(shù)字符串中有效字符的統(tǒng)計字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2.5字符串中字符的插入和刪除在字符串指定位置插入字符首先在字符串中查找指定字符位置,然后將指定位置后的所有字符依次向后移動一個字符位置以空出插入字符所需的空間;最后將該字符插入到指定位置。字符的插入方式前插:插入字符在指定位置原字符之前后插:插入字符在指定位置原字符之后

7.2.5字符串中字符的插入和刪除voidinsertchr(chars[],charpos,charc){ intlast=strlen(s); char*p; p=strchr(s,pos); if(p!=NULL) {for(;&s[last]>=p;last--) s[last+1]=s[last]; *p=c; } else

{s[last+1]=s[last]; s[last]=c;}}Thsis\0s‘s’‘i’p6&s[6]sis\0i存放字符串的數(shù)組插入位置處的字符插入的字符找不到插入點,則將字符插入到字符串的末尾。P229例7-17s[6]s[7]s[2]s[3]在字符串中刪除指定的字符

基本思想:首先在字符串中查找指定字符的位置,若找到則將字符串中自該位置以后所有字符依次向前移動一個字符位置即可。

例7-18

請編制函數(shù),并用相應(yīng)主函數(shù)測試函數(shù)原型:

voiddeletechr(chars[],charc);

其功能是在字符串中刪除指定字符,若指定字符不存在則顯示相應(yīng)提示信息。7.2.5字符串中字符的插入和刪除使用標準函數(shù)在串中刪去某個字符的方法:將被刪除字符后的字符串拷貝到該字符位置。voiddeletechr(chars[],charc){ char*p; p=strchr(s,c); if(p!=NULL) strcpy(p,p+1); else printf("'%c'不在'%s'中.\n",c,s);}7.2.5字符串中字符的插入和刪除sabcdef\0‘C’pp+1

def\0

字符串的常用處理方法及標準庫函數(shù)字符串中有效字符的統(tǒng)計字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2.6字符串的比較和子串的查找標準字符串比較函數(shù)strcmp函數(shù)原型intstrcmp(constchar*string1,constchar*string2);函數(shù)調(diào)用:strcmp(s1,s2);

函數(shù)功能:按ASCII碼值的大小對兩個字符串從左到右逐個字符依次比較,直到出現(xiàn)不同字符或遇到字符結(jié)束符’\0’為止。比較結(jié)果的判斷規(guī)則如下:

例7-19

編制字符串比較函數(shù)strcompare,并用主函數(shù)測試。7.2.6字符串的比較和子串的查找字符數(shù)組方式實現(xiàn)兩個字符串比較intstrcompare(chars[],chart[]){ inti; for(i=0;s[i]==t[i];i++) if(s[i]=='\0') return0; returns[i]-t[i];}abcd\0sabkd\0t-899107比較字符串前n個字符的標準函數(shù)strncmp

函數(shù)原型:intstrncmp(char*string1,char*string2,size_tcount);

函數(shù)調(diào)用:strncmp(str1,str2,n)

函數(shù)功能:比較str1和str2兩個字符串的前n個字符是否相等,如果相等則返回0,否則返回非0。7.2.6字符串的比較和子串的查找

例7-22

使用標準strncmp函數(shù)比較兩個字符串前n個字符字符串中子串的查找子串:指字符串從某一位置開始連續(xù)的若干個字符構(gòu)成的一個字符序列。主串:包含子串的字符串?;舅枷胍唬孩偈紫仍谥鞔胁檎易哟氖鬃址?;②如果找到則比較主串中其后連續(xù)的若干字符是否與子串相同;③如果相同則返回子串首字符在主串中出現(xiàn)的位置(序號或地址);否則繼續(xù)查找,直到主串中查找不到子串的首字符為止;④當被查找子串在主串中不存在,則函數(shù)返回-1或者NULL。7.2.6字符串的比較和子串的查找例7-23b

編制字符串中查找子串函數(shù)并用主函數(shù)測試7.2.6字符串的比較和子串的查找intfindsubstr(chars[],chart[]) { intsearch_chr(chars[],charc); inti=0,len=strlen(t); while((i=search_chr(&s[i],t[0]))!=-1) {if(strncmp(&s[i],t,len)==0) returni; else i++; } return-1;}求子串長度從首字符開始比較主串中有無子串,有則返回子串首字符在主串中的序號,否則繼續(xù)查找。在主串中查找子串首字符,返回下標序號主串中無子串返-1abcdef\0scde\0t3i=2len=3字符串中子串的查找

基本思想二:即從主串中的第一個字符開始,以后依次向后移動一個字符的位置,取出主串中與子串長度相等的前幾個字符與子串比較。若相等則返回子串在主串中的起始位置,否則繼續(xù),直到主串查找完畢為止。若主串中不存在子串,返回-1。

intfindsubstr(chars[],chart[]){ inti=0,len=strlen(t); while(strncmp(&s[i],t,len)!=0&&s[i]!='\0') i++; returns[i]!='\0'?i:-1;}7.2.6字符串的比較和子串的查找abcdef\0scde\0t字符串的常用處理方法及標準庫函數(shù)字符串中有效字符的統(tǒng)計字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2.7字符串中子串的插入和刪除字符串中子串的插入

基本思想:①首先在字符串中找到插入位置

②移動插入點之后的所有字符以騰出欲插入的子串長度的位置;

③進行插入操作。

例7-25

編制子串插入函數(shù),用主函數(shù)測試。函數(shù)原型為:

voidinsertsubstr(chars[],chart[]);7.2.7字符串中子串的插入和刪除voidinsertsubstr(chars[],chart[]){intsearch_chr(chars[],charc);inti,j,len=strlen(t);for(i=0;s[i]!='\0';i++) ;j=search_chr(s,t[0]); if(j!=-1){for(;i>=j;i--) s[i+len]=s[i];

i++;

for(j=0;t[j]!='\0';j++,i++)s[i]=t[j]; }else printf("字符'%c'不在字符串'%s'中.\n",t[0],s);}sabcdefg\0

c123\0

tcdefg\0

4j=2i=7

c123

i=2尾插入點找主串的尾部,使得i=7i=strlen(s);7.2.7字符串中子串的插入和刪除voidinsertsubstr(char*s,char*t){char*p1;p1=strchr(s,*t);if(p1!=NULL) { strcat(t,p1);

strcpy(p1,t); }else printf("字符'%c'不在字符串'%s'中.",t[0],s);}

例7-26

改寫例7.25程序,充分利用標準函數(shù)編程實現(xiàn)子串插入函數(shù)insertsubstr。sabcdefg\0

c123\0

tp1cdefg\0

c123

cdefg\07.2.7字符串中子串的插入和刪除字符串中子串的刪除

基本思想:首先在主串中找到欲刪除子串的首字符位置,然后向前移動被刪除子串之后的所有字符。

例7-27

函數(shù)原型為:

voiddelsubstr(chars[],chart[]);

其功能是在一個主串中查找子串,找到則將子串從主串中刪除;若子串不存在則給出提示信息。

7.2.7字符串中子串的插入和刪除voiddelsubstr(chars[],chart[]){ intfindsubstr(chars[],chart[]); intpos,len; pos=findsubstr(s,t); if(pos!=-1) {len=strlen(t); for(;(s[pos]=s[pos+len])!='\0';pos++); } else printf("串'%s'不在串'%s'中.\n",t,s);}sabcdefg\0

cde\0

t取子串t的長度將s串中被刪子串后的所有字符向前移動t串的長度距離。322POS5POS+32+3Len主串中查找子串

fg\0

7.2.7字符串中子串的插入和刪除例7-28重寫例7.27程序,充分利用標準函數(shù)編程實現(xiàn)子串刪除函數(shù)。voiddelsubstr(chars[],chart[]){ intfindsubstr(chars[],ch

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論