第7章字符串及其應(yīng)用_第1頁(yè)
第7章字符串及其應(yīng)用_第2頁(yè)
第7章字符串及其應(yīng)用_第3頁(yè)
第7章字符串及其應(yīng)用_第4頁(yè)
第7章字符串及其應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩79頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語(yǔ)言的字符串表示方法字符串的常用處理方法及標(biāo)準(zhǔn)庫(kù)函數(shù)

第7章字符串及其應(yīng)用在C中,字符串的表示和處理是通過(guò)字符數(shù)組來(lái)實(shí)現(xiàn)的,和其它類(lèi)型的數(shù)組一樣,只需要知道其起始位置,而起始位置可以用數(shù)組名或者指針來(lái)表示。

主要有兩種方式來(lái)表示字符串,這兩種方式是:使用指向字符類(lèi)型變量的指針

通過(guò)定義字符類(lèi)型指針變量,并將字符串或字符串常量的首地址賦給該指針,此后可以用該指向字符串的指針變量來(lái)表示其所指向的字符串?dāng)?shù)據(jù),例如

char*sPtr;*sPtr=”ThisisCString.”;

使用字符數(shù)組

首先定義字符類(lèi)型的數(shù)組,然后將字符串?dāng)?shù)據(jù)的每一個(gè)字符依次存放到指定的字符數(shù)組中,此后的程序代碼中可以使用該字符數(shù)組的名字表示其所存放的字符串?dāng)?shù)據(jù)。例如語(yǔ)句

charstr[7]=”abcd”

7.1C語(yǔ)言的字符串表示方法兩種字符串?dāng)?shù)據(jù)表示方式的根本區(qū)別

(1)定義一個(gè)字符類(lèi)型指針變量表示字符串

例如語(yǔ)句char*sPtr=”abcd”;

系統(tǒng)處理的方法是首先在系統(tǒng)的內(nèi)存儲(chǔ)器中分配一段連續(xù)的存儲(chǔ)區(qū)域并存放指定的字符串常量,然后將該存儲(chǔ)區(qū)域的起始地址(字符串常量的首地址)賦值給字符類(lèi)型指針變量sPtr,字符指針變量與其所指向的字符串常量之間的關(guān)系如圖7.1a所示。由于sPtr是指針變量,可以根據(jù)需要指向任意合法的字符數(shù)據(jù)對(duì)象,所以在此后的程序代碼中任何修改其指向的操作都是合法的,例如使用語(yǔ)句sPtr=”1234”使得指針變量sPtr改變指向從表示字符串?dāng)?shù)據(jù)”abcd”轉(zhuǎn)變成為表示字符串?dāng)?shù)據(jù)”1234”,sPtr與其所指向的字符串常量之間的關(guān)系如圖7.1b所示。

7.1.1字符串表示方法

abcd\0sPtra)指針變量指向字符串常量abcd\0abcd\0sPtrb)指針變量改變?cè)赶蛑赶蛄硪蛔址?234\0圖7.1指針變量與字符串?dāng)?shù)據(jù)對(duì)象的關(guān)系示意圖7.1.1字符串表示方法

(2)定義字符類(lèi)型數(shù)組表示字符串

例如語(yǔ)句charstr[7]=”abcd”;,其本質(zhì)意義是首先為字符數(shù)組str按指定長(zhǎng)度在系統(tǒng)的內(nèi)存儲(chǔ)器中分配連續(xù)的存儲(chǔ)區(qū)域,字符數(shù)組的名字str表示這段連續(xù)存儲(chǔ)區(qū)域的起始地址,然后將該存儲(chǔ)區(qū)域的內(nèi)容初始化為字符串?dāng)?shù)據(jù)”abcd”,字符數(shù)組str與其初始值之間的關(guān)系如圖7.2所示。abcd\0\0

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

程序代碼中任何試圖修改數(shù)組名str值的操作或者試圖為數(shù)組整體賦值的操作都是錯(cuò)誤的,請(qǐng)比較下面的兩段代碼:

/*正確的程序代碼段*/char*sPtr=”abcd”;…

sPtr=”1234”; /*改變指針變量sPtr的指向*//*錯(cuò)誤的程序代碼段*/charstr[7]=”abcd”;…

str=”1234”;//錯(cuò)誤賦值操作,試圖將數(shù)組作為整體操作7.1.1字符串表示方法字符數(shù)組初始化的兩種主要方法

(1)使用單個(gè)字符常量初始化字符數(shù)組用單個(gè)字符初始化時(shí),將常量表中的字符依次賦值給對(duì)應(yīng)的字符數(shù)組元素。在初始化時(shí)應(yīng)注意以下幾點(diǎn):常量表中的單個(gè)字符使用單引號(hào),最后一個(gè)字符應(yīng)該是字符串結(jié)尾符號(hào)'\0'字符;部分初始化時(shí)未賦值部分仍然是'\0'字符;如果常量表中提供了所有的字符(包含'\0'),可以省略數(shù)組的長(zhǎng)度;下面是幾個(gè)單個(gè)字符常量初始化字符數(shù)組的示例:

chars1[9]={'N','e','w','','Y','e','a','r','\0'};chars2[9]={'H','e','a','d','\0'};chars3[]={'N','e','w','','Y','e','a','r','\0'};

chars4[]={‘N’,‘e’,‘w’,‘\0','Y','e','a','r','\0'};7.1.1字符串表示方法當(dāng)遇到\0時(shí)就表示字符串結(jié)束,S4的有效字符串是New,3個(gè)。其字符串的長(zhǎng)度為3+1。

(2)使用字符串常量初始化字符數(shù)組 使用字符串常量對(duì)字符數(shù)組進(jìn)行初始化時(shí),系統(tǒng)會(huì)自動(dòng)在末尾加上字符串結(jié)尾符號(hào)'\0',但定義的字符數(shù)組必須提供足夠的長(zhǎng)度。在初始化時(shí)應(yīng)該注意以下幾點(diǎn):字符串常量只需要提供有效字符數(shù)據(jù);字符串常量不足以填滿整個(gè)字符數(shù)組空間時(shí)仍然使用'\0'字符填充;字符串常量數(shù)據(jù)可以使用花括號(hào)括住,也可以不使用花括號(hào);如果沒(méi)有指定字符數(shù)組的長(zhǎng)度,系統(tǒng)自動(dòng)指定為字符串常量中有效字符的個(gè)數(shù)+1;下面是幾個(gè)字符串常量初始化字符數(shù)組的示例:chars1[80]={"NewYear"};chars2[80]=“NewYear”;//可以省略花括號(hào){}chars3[]="NewYear";//此時(shí)字符數(shù)組的長(zhǎng)度為97.1.1字符串表示方法字符串?dāng)?shù)據(jù)的輸入

C中通過(guò)函數(shù)scanf()和gets()來(lái)實(shí)現(xiàn)/*使用格式控制項(xiàng)%逐個(gè)輸入*/charstr[10];intj;for(j=0;j<9;j++)

scanf(“%c”,&str[j]);str[j]=’\0’;/*為了保證字符串?dāng)?shù)據(jù)的完整性,自行處理字符串結(jié)尾符號(hào)*//*使用格式控制項(xiàng)%s全部輸入*/charstr[10];scanf(“%s”,str);/*字符串?dāng)?shù)據(jù)作為整體處理,系統(tǒng)會(huì)自動(dòng)處理結(jié)尾符號(hào)*/

在使用標(biāo)準(zhǔn)庫(kù)函數(shù)gets時(shí),將字符串?dāng)?shù)據(jù)作為一個(gè)整體來(lái)看待如下所示:/*使用標(biāo)準(zhǔn)庫(kù)函數(shù)gets*/charstr[10];gets(str);/*字符串?dāng)?shù)據(jù)作為整體處理,系統(tǒng)會(huì)自動(dòng)處理結(jié)尾符號(hào)*/7.1.2字符串的輸入輸出getchar()-輸入一個(gè)字符,不能輸入字符串使用格式控制項(xiàng)%s全部輸入或者輸出字符串的注意事項(xiàng)正確的輸入輸出:charstr[10]scanf((“%s”,str);/*從鍵盤(pán)輸入字符串并存于字符數(shù)組str中*/printf(“%s”,str);/*輸出字符數(shù)組str*/printf(“%s”,&str[2]);/*輸出字符數(shù)組str中從第3個(gè)字符開(kāi)始的字符串*/錯(cuò)誤的輸入輸出:charstr[10]scanf(“%s”,str[2]);/*str[2]是字符數(shù)組類(lèi)型,和%s不匹配*/scanf(“%s”,&str);/*str是字符數(shù)組名代表了數(shù)組的首地址,不應(yīng)該在數(shù)組名前加取地址運(yùn)算符*/print(“%s”,str[5]);/*函數(shù)中的輸出項(xiàng)應(yīng)該為字符串名,而不應(yīng)該是字符數(shù)組元素名。*/

7.1.2字符串的輸入輸出scanf函數(shù)gets函數(shù)在使用時(shí)的兩個(gè)不同之處

(1)一次函數(shù)調(diào)用可以輸入的字符串?dāng)?shù)據(jù)個(gè)數(shù)不同

scanf(“%s%s”,str1,str2);/*一次調(diào)用可以輸入多個(gè)用空格分隔的字符串*/gets(str1);/*一次調(diào)用只能夠輸入一個(gè)字符串*/例如:輸入howdoyoudocharstr1[5],str2[5],str3[5],str4[5];scanf(“%s%s%s%s”,str1,str2,str3,str4);其存儲(chǔ)形式為:str1str2str3str4

7.1.2字符串的輸入輸出how\0do\0you\0do\0scanf函數(shù)gets函數(shù)在使用時(shí)的兩個(gè)不同之處

(1)一次函數(shù)調(diào)用可以輸入的字符串?dāng)?shù)據(jù)個(gè)數(shù)不同

scanf(“%s%s”,str1,str2);/*一次調(diào)用可以輸入多個(gè)用空格分隔的字符串*/gets(str1);/*一次調(diào)用只能夠輸入一個(gè)字符串*/

(2)空格字符的處理不同使用標(biāo)準(zhǔn)庫(kù)函數(shù)scanf時(shí),由于空格字符作為兩個(gè)字符串?dāng)?shù)據(jù)的分隔符出現(xiàn),所以在輸入的字符串?dāng)?shù)據(jù)中不能含有空格字符;而使用標(biāo)準(zhǔn)庫(kù)函數(shù)gets時(shí),輸入的字符串?dāng)?shù)據(jù)中可以含有空格字符。

gets(str);/*從鍵盤(pán)上輸入howdoyoudo保留在str中,后續(xù)可以使用配對(duì)的put(str)輸出*/7.1.2字符串的輸入輸出2)字符串?dāng)?shù)據(jù)的輸出/*調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)printf使用格式控制項(xiàng)%c*/intj=0;…while(str[j]!=’\0’)/*用處理數(shù)組的概念處理字符串*/printf(“%c”,str[j++]);…/*調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)printf使用格式控制項(xiàng)%s*/…printf(“%s”,str); /*將字符串?dāng)?shù)據(jù)作為整體看待*//*使用標(biāo)準(zhǔn)庫(kù)函數(shù)puts*/…puts(str); /*將字符串?dāng)?shù)據(jù)作為整體看待*/7.1.2字符串的輸入輸出printf函數(shù)和puts函數(shù)在使用時(shí)的兩個(gè)不同之處

(1)一次調(diào)用能夠輸出的字符串個(gè)數(shù)不同

printf(“%s\n%s”,str1,str2);/*一次調(diào)用輸出兩個(gè)以上的字符串?dāng)?shù)據(jù)*/puts(str1)/*一次調(diào)用只能輸出一個(gè)字符串?dāng)?shù)據(jù)*/

(2)輸出數(shù)據(jù)換行處理方式不同 使用標(biāo)準(zhǔn)庫(kù)函數(shù)puts輸出字符串?dāng)?shù)據(jù)時(shí),輸出完成后會(huì)自動(dòng)進(jìn)行換行;而使用標(biāo)準(zhǔn)庫(kù)函數(shù)printf時(shí),一個(gè)字符串?dāng)?shù)據(jù)輸出完成后不會(huì)自動(dòng)換行,若需實(shí)現(xiàn)換行功能,需要在格式控制字符串中的適當(dāng)位置插入換行字符’\n’。

例7-1

字符串?dāng)?shù)據(jù)的輸入輸出示例。

7.1.2字符串的輸入輸出/*Name:ex07-01.cpp*/#include<stdio.h>#defineN100voidmain(){ chars1[N],s2[N],s3[N],s4[N];

inti;

printf("單個(gè)字符輸入方式1:\n");

for(i=0;i<N;i++) /*用字符方式輸入字符串*/ { scanf("%c",&s1[i]); if(s1[i]=='\n') break; } s1[i-1]=‘\0’;/*最后一個(gè)字符即s1[99]是結(jié)束符號(hào),有效字符到s1[98]就結(jié)束*/

printf("單個(gè)字符輸入方式2:\n");

for(i=0;i<N;i++) /*用字符方式輸入字符串*/ if((s2[i]=getchar())=='\n') break;

s2[i-1]='\0';/*最后一個(gè)字符即s2[99]是結(jié)束符號(hào),有效字符到s2[98]就結(jié)束*/

printf("字符串整體輸入方式1:\n"); gets(s3); /*字符串作為整體輸入,系統(tǒng)會(huì)自動(dòng)添加結(jié)尾符號(hào)*/

printf("字符串整體輸入方式2:\n"); scanf("%s",s4);/*字符串作為整體輸入,系統(tǒng)會(huì)自動(dòng)添加結(jié)尾符號(hào)*/

printf("\n");

for(i=0;s4[i]!='\0';i++) /*用單個(gè)字符處理形式輸出字符串*/ putchar(s4[i]);

printf(“\n”); /*對(duì)上面的輸出處理完成后換行*/ printf("%s%s\n",s3,s2); /*輸出兩個(gè)字符串,自行處理?yè)Q行*/ puts(s1); /*輸出一個(gè)字符串,系統(tǒng)自動(dòng)換行*/}例7-2

將字符串中小寫(xiě)字母轉(zhuǎn)變成大寫(xiě)字母。/*Name:ex07-02.cpp*/#include<stdio.h>voidmain(){ charstring[100],*p;

printf("Pleaseinputastring:");

gets(string);

p=string; while(*p!='\0') { if(*p>='a'&&*p<='z') *p-=32; p++;/*移動(dòng)指針變量對(duì)字符串中的字符依次進(jìn)行處理*/ }

printf("Thenewstringis:");

puts(string);}7.1.2字符串的輸入輸出指針指向字符串的首地址,相當(dāng)于賦初值C語(yǔ)言的字符串表示方法字符串的常用處理方法及標(biāo)準(zhǔn)庫(kù)函數(shù)第7章字符串及其應(yīng)用字符串中有效字符的統(tǒng)計(jì)字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2字符串的常用處理方法及標(biāo)準(zhǔn)庫(kù)函數(shù)字符串中有效字符的統(tǒng)計(jì)

所謂測(cè)試字符串的長(zhǎng)度就是統(tǒng)計(jì)字符串中包含的有效字符個(gè)數(shù)。統(tǒng)計(jì)字符串中有效字符個(gè)數(shù)的基本思想非常簡(jiǎn)單,只需要從字符串?dāng)?shù)據(jù)的的第一個(gè)字符位置開(kāi)始,依次向后判斷該位置的字符是否系統(tǒng)規(guī)定的字符串?dāng)?shù)據(jù)結(jié)尾字符(’\0’),當(dāng)不是字符串?dāng)?shù)據(jù)結(jié)尾字符時(shí)則予以統(tǒng)計(jì),直到遇到系統(tǒng)規(guī)定的字符串?dāng)?shù)據(jù)結(jié)尾符號(hào)為止。

例7-3

字符串長(zhǎng)度測(cè)試函數(shù)的原型為:

int

strlength(chars[]);

編制該函數(shù)并用相應(yīng)主函數(shù)進(jìn)行測(cè)試。7.2.1字符串中有效字符的統(tǒng)計(jì)/*Name:ex07-03.cpp*/#include<stdio.h>voidmain(){int

strlength(chars[]); charstr[100];

printf("Inputthestring:");

gets(str);

printf("Thelengthofstringis%d\n",strlength(str));}int

strlength(chars[]){ inti;

for(i=0;s[i]!='\0';i++) ; returni;}7.2.1字符串中有效字符的統(tǒng)計(jì)循環(huán)變量i是字符個(gè)數(shù),也就是字符串的有效字符個(gè)數(shù)即長(zhǎng)度int

strlength(char*s){inti=0;while(*s)

i++,s++;returni

在C標(biāo)準(zhǔn)庫(kù)中提供了測(cè)試字符串長(zhǎng)度的標(biāo)準(zhǔn)庫(kù)函數(shù)strlen,函數(shù)的原型為:

size_t

strlen(constchar*string);

函數(shù)原型中的size_t是系統(tǒng)定義好的用于統(tǒng)計(jì)存儲(chǔ)單元個(gè)數(shù)和重復(fù)次數(shù)的數(shù)據(jù)類(lèi)型,實(shí)質(zhì)上就是整型數(shù)據(jù)類(lèi)型。函數(shù)的功能是:返回(獲?。┯蓅tring表示的字符串?dāng)?shù)據(jù)中的有效字符個(gè)數(shù),統(tǒng)計(jì)在遇到字符串?dāng)?shù)據(jù)中的第一個(gè)系統(tǒng)字符串結(jié)尾字符’\0’時(shí)結(jié)束。

const含義:表示指針指向的是常量,不允許對(duì)內(nèi)容string進(jìn)行修改。

7.2.1字符串中有效字符的統(tǒng)計(jì)/*Name:ex07-03-1.cpp*/#include<stdio.h>#include<string.h>

/*字符串標(biāo)準(zhǔn)函數(shù)庫(kù)*/voidmain(){charstring[100];

intl;

printf(“請(qǐng)輸入字符串\n");

gets(string);

l=strlen(string);

printf("字符串長(zhǎng)度=%d\n",l);}size_t

strlen(constchar*string);

/*字符串長(zhǎng)度原型的聲明*/例7-4

顛倒字符串函數(shù)的原型為:

voidreverse(chars[]);

請(qǐng)編制該函數(shù)并用相應(yīng)主函數(shù)測(cè)試。例如,輸入abcd,輸出時(shí)顯示dcba。

例7-5

一個(gè)從左讀或從右讀都是相同的單詞稱為回文,例如level是回文。編程序?qū)崿F(xiàn)功能:判斷輸入一個(gè)字符串是否回文。

7.2.1字符串中有效字符的統(tǒng)計(jì)/*Name:ex07-04.cpp*/#include<stdio.h>#include<string.h>voidmain(){ voidreverse(char

*s);/*函數(shù)的聲明*/ chars[100];

printf("Inputthestring:");

gets(s);

reverse(s);

puts(s);}voidreverse(char

*s){ inti=0,j=strlen(s)-1,t;/*有效字符下標(biāo)從0開(kāi)始,到strlen(s)-1結(jié)束*/

for(;i<j;i++,j--) { t=s[i];

s[i]=s[j];

s[j]=t; }}第1個(gè)字符和最后1個(gè)字符交換/*Name:ex07-05-1.cpp*/#include<stdio.h>#include<string.h>voidmain(){ charword[80];

int

i,j,flag=1; puts("請(qǐng)輸入一個(gè)單詞:");

gets(word); j=strlen(word)-1;//獲取字符串的長(zhǎng)度

for(i=0;i<j;i++,j--) {if(word[i]!=word[j]) flag=0; break; }

if(flag)

printf("單詞'%s'是回文!\n",word); else

printf("單詞'%s'不是回文!\n",word);}/*Name:ex07-05.cpp*/#include<stdio.h>#include<string.h>voidmain(){ charword[80],*head,*end;

int

len,flag=1; puts("請(qǐng)輸入一個(gè)單詞:");

gets(word);

len=strlen(word);//獲取字符串的長(zhǎng)度

head=word; //初始時(shí),head指針指向字符串的首字符

end=head+len-1; //初始時(shí),end指針指向字符串的最后一個(gè)有效字符

while(*head=='')//移動(dòng)頭指針跳過(guò)字符串的前導(dǎo)空格

head++;

while(*end=='')//移動(dòng)尾指針跳過(guò)字符串的后續(xù)空格

end--;

for(;head<end;head++,end--) { if(*head!=*end) //遇到對(duì)應(yīng)位置字符不同則停止比較

{ flag=0; break; } }

if(flag)/*flag=1時(shí)*/

printf("單詞'%s'是回文!\n",word); else

printf("單詞'%s'不是回文!\n",word);}字符串中有效字符的統(tǒng)計(jì)字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2字符串的常用處理方法及標(biāo)準(zhǔn)庫(kù)函數(shù)字符串的復(fù)制

字符串復(fù)制(拷貝)就是復(fù)制已經(jīng)存在字符串的所有字符到指定目標(biāo)位置,其基本思想是:從源字符串?dāng)?shù)據(jù)的第一個(gè)字符開(kāi)始依次取出源字符串中的每一個(gè)字符,只要該字符不是系統(tǒng)規(guī)定的字符串結(jié)尾符號(hào)就將其賦值到指定的目標(biāo)位置,直到源字符串中的所有有效字符取完為止。

例7-6

函數(shù)的原型為:voidstrcopy(chars[],chart[]);,其功能是將t所表示的字符串復(fù)制到s中去,請(qǐng)編制該函數(shù)并用相應(yīng)主函數(shù)測(cè)試。

7.2.2字符串的復(fù)制/*Name:ex07-06.cpp*/#include<stdio.h>voidmain(){ voidstrcopy(char

s[],chart[]); chars1[80],s2[80];

printf("Inputthestringstr1:"); gets(s1); strcopy(s2,s1); puts(s2);}voidstrcopy(char

s[],chart[]){ inti;

for(i=0;t[i]!='\0';i++)

s[i]=t[i];

s[i]='\0';}依次取出字符串t的字符賦給s的當(dāng)前位置。然后雙雙移動(dòng)到下一個(gè)字符繼續(xù)…直到遇到結(jié)束符號(hào)為止。

標(biāo)準(zhǔn)函數(shù)庫(kù)中提供了相應(yīng)的字符串拷貝函數(shù),函數(shù)的原型為:

char*strcpy(char*strDestination,constchar*strSource);

函數(shù)的功能是:將由strSource表示的源字符串拷貝到由strDestination指定的目標(biāo)地址中,然后返回strDestination;strDestination所代表目標(biāo)字符串的字節(jié)長(zhǎng)度必須滿足strSource所代表字符串的長(zhǎng)度要求。

例7-7

使用C標(biāo)準(zhǔn)庫(kù)函數(shù)strcpy實(shí)現(xiàn)字符串的拷貝。7.2.2字符串的復(fù)制7.2.2字符串的復(fù)制/*Name:ex07-07.cpp*/#include<stdio.h>#include<string.h>/*包含字符處理所有函數(shù)的頭函數(shù)*/voidmain(){ chars1[80],s2[80];

printf("Inputthestringstr1:"); gets(s1); strcpy(s2,s1); puts(s2);}字符串的復(fù)制應(yīng)注意的事項(xiàng)

在實(shí)際的程序設(shè)計(jì)中,有可能存在著將源字符串從某一位置開(kāi)始的字符拷貝到目標(biāo)字符串的要求,對(duì)于這種要求可以通過(guò)調(diào)用函數(shù)時(shí)使用合適的實(shí)際參數(shù)予以滿足,注意到下面三個(gè)重要事實(shí):字符串的復(fù)制字符串處理函數(shù)中使用的字符數(shù)組樣式形式參數(shù)本質(zhì)上是一個(gè)指針量(地址量),對(duì)應(yīng)的實(shí)際參數(shù)只需要地址量即可。在第4章中討論過(guò)數(shù)組作參數(shù)的部分共享問(wèn)題,可以將實(shí)參字符串的部分提供給形參數(shù)組共享。C語(yǔ)言中的字符串在存儲(chǔ)時(shí)系統(tǒng)會(huì)為其添加字符串結(jié)尾符號(hào),程序中處理字符串時(shí)只需要指出開(kāi)始位置即可。7.2.2字符串的復(fù)制

例7-8

編程序?qū)崿F(xiàn)將源字符串從指定位置開(kāi)始拷貝到目標(biāo)字符串的功能。/*Name:ex07-08.cpp*/#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);語(yǔ)句

puts(s2);}

例7-9

編程序?qū)崿F(xiàn)將字符串的某部分刪除的功能,刪除的起點(diǎn)和長(zhǎng)度從鍵盤(pán)輸入。如果字符串中從起點(diǎn)開(kāi)始剩余的字符數(shù)據(jù)不能滿足長(zhǎng)度要求則刪去從起點(diǎn)開(kāi)始的所有字符。7.2.2字符串的復(fù)制

例7-9

編程序?qū)崿F(xiàn)將字符串的某部分刪除的功能,刪除的起點(diǎn)和長(zhǎng)度從鍵盤(pán)輸入。如果字符串中從起點(diǎn)開(kāi)始剩余的字符數(shù)據(jù)不能滿足長(zhǎng)度要求則刪去從起點(diǎn)開(kāi)始的所有字符。#include<stdio.h>#include<string.h>voidmain(){ chars[100];int

start,len,length;

printf("請(qǐng)輸入被處理的字符串:");

gets(s);

printf("請(qǐng)輸入刪除的起始點(diǎn)位置:");

scanf("%d",&start); //從鍵盤(pán)上獲取刪除的起點(diǎn)位置

printf("請(qǐng)輸入欲刪除的字符個(gè)數(shù):");

scanf("%d",&length);//從鍵盤(pán)上獲取欲刪去的字符個(gè)數(shù)

len=strlen(&s[start]);//獲取自刪除起始點(diǎn)開(kāi)始至串尾的字符個(gè)數(shù)

if(len<length)

strcpy(s+start,s+strlen(s));//剩余部分不能滿足刪除要求時(shí)

else

strcpy(s+start,s+start+length);//剩余部分能夠滿足刪除要求時(shí)

puts(s);}字符串中有效字符的統(tǒng)計(jì)字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2字符串的常用處理方法及標(biāo)準(zhǔn)庫(kù)函數(shù)字符串的連接

所謂字符串的連接本質(zhì)上也是字符串拷貝,與字符串復(fù)制不同的是需要將指定的源字符串?dāng)?shù)據(jù)中的每一個(gè)字符依次拷貝到指定的目標(biāo)字符串最后一個(gè)有效字符的后面而不是目標(biāo)串中的第一個(gè)位置。實(shí)現(xiàn)字符串連接的基本思想是:首先找到目標(biāo)字符串的結(jié)尾處,然后從源字符串的第一個(gè)字符開(kāi)始依次取出每一個(gè)有效字符并依次賦值到指定目標(biāo)位置,直到源字符串中的字符處理完成為止。

例7-10

函數(shù)原型為:voidstrjoin(char

s[],chart[]);,其功能是將t所表示的字符串連接到s所表示的字符串末尾,請(qǐng)編制該函數(shù)并用相應(yīng)主函數(shù)測(cè)試。7.2.3字符串的連接/*Name:e0x7-10.cpp*/#include<stdio.h>voidmain(){ voidstrjoin(chars[],chart[]); chars1[80],s2[80];

printf("Inputs1&s2:\n"); gets(s1);gets(s2); strjoin(s1,s2); puts(s1);}voidstrjoin(char

s[],chart[]){ int

i,j=0;

for(i=0;s[i]!='\0';i++); //尋找前串的末尾

for(j=0;t[j]!='\0';j++,i++)//實(shí)現(xiàn)字符串連接

s[i]=t[j];

s[i]='\0';}

在標(biāo)準(zhǔn)函數(shù)庫(kù)中提供了相應(yīng)的字符串連接函數(shù),函數(shù)的原型為:

char*strcat(char*strDestination,constchar*strSource);

函數(shù)的功能是:將由strSource

表示的源字符串拷貝到由strDestination表示的目標(biāo)字符串的末尾(即連接到strDestination所表示的字符串后),然后返回strDestination;strDestination所代表目標(biāo)字符串的字節(jié)長(zhǎng)度必須滿足兩個(gè)字符串連接后的長(zhǎng)度要求。

7.2.3字符串的連接/*Name:ex07-11.cpp*/#include<stdio.h>#include<string.h>voidmain(){ chars1[80],s2[80];

printf("Inputs1&s2:\n"); gets(s1); gets(s2);

strcat(s1,s2); puts(s1);}7.2.3字符串的連接Inputs1&s2:ABCDE12345ABCDE12345

例7-11

使用C標(biāo)準(zhǔn)庫(kù)函數(shù)strcat實(shí)現(xiàn)字符串的連接。

#include<stdio.h>#include<string.h>voidmain(){ chars1[80],s2[80];

intpos;

printf("Inputs1ands2:\n"); gets(s1); gets(s2);

printf("Inputthepos:");

scanf("%d",&pos); strcat(s1,&s2[pos]); puts(s1);}7.2.3字符串的連接Inputs1ands2:ABCDEFG12345Inputthepos:3//這里的3是指s2[3]元素,不是12345字符的3ABCDEFG45例7-12

編程序?qū)崿F(xiàn)將源字符串從指定位置開(kāi)始連接到目標(biāo)字符串的功能。字符串中有效字符的統(tǒng)計(jì)字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2字符串的常用處理方法及標(biāo)準(zhǔn)庫(kù)函數(shù)字符串中字符的查找

所謂字符串中字符的查找就是按照指定的方向?qū)ふ抑付ㄗ址谝淮卧谧址谐霈F(xiàn)的位置。在字符串中查找指定的字符從查找方向上可以分為正向查找(從串首部至串尾)和反向查找(從串尾部至串首),從獲取被查找字符位置信息上可以分為返回下標(biāo)序號(hào)方式和返回字符存放地址方式。7.2.4字符串中字符的查找字符串中正向查找指定字符

在字符串中正向查找指定字符第一次出現(xiàn)位置的基本思想是:從被操作字符串的第一個(gè)字符開(kāi)始循環(huán)依次取出被操作字符串當(dāng)前位置的字符與指定的字符相比較,若比較相符合則返回該字符的位置;否則進(jìn)行下一輪比較直到被處理的字符串中所有字符取完為止。

例7-13

編制函數(shù)實(shí)現(xiàn)功能:在字符串中正向查找指定的字符,若被查找字符存在則返回字符在字符串中的下標(biāo)序號(hào);若指定的字符在被查找的字符串中不存在,則返回-1;并用相應(yīng)主函數(shù)進(jìn)行測(cè)試。

C語(yǔ)言的查找字符的標(biāo)準(zhǔn)庫(kù)函數(shù)為:

char*strchr(constchar*string,intc)功能:查找字符c在字符串string中首次出現(xiàn)的位置,NULL結(jié)束符也包含在查找中.返回一個(gè)指針,指向字符c在字符串string中首次出現(xiàn)的位置,如果沒(méi)有找到,則返回NULL.7.2.4字符串中字符的查找/*Name:ex07-13.cpp*/#include<stdio.h>voidmain(){ int

search_chr(chars[],charc); chars1[80],ch;intpos;

printf("Inputthestring:"); gets(s1); printf("Inputthecharacter:");

ch=getchar(); pos=search_chr(s1,ch);

if(pos!=-1)/*注意pos的初始位置是0*/

printf("Thepositioniss1[%d].\n",pos); else

printf("'%c'isnotin'%s'.\n",ch,s1);}int

search_chr(char

s[],charc){ inti;

for(i=0;s[i]!='\0';i++)

if(s[i]==c) returni; return-1;}/*Name:ex07-15.cpp*/#include<stdio.h>#include<string.h>voidmain(){ chars1[80],s2[80],s3[80]="",*pos; int

i,j;

printf("輸入字符串s1:"); gets(s1);

printf("輸入字符串s2:"); gets(s2);

for(i=0,j=0;s1[i]!='\0';i++) { pos=strchr(s2,s1[i]);

if(pos!=NULL&&strchr(s3,s1[i])==NULL) { s3[j++]=s1[i]; s3[j]='\0';} } s3[j]='\0'; if(strlen(s3)!=0) { printf("兩個(gè)串中共有的字符串構(gòu)成的字符串是:"); puts(s3); } else

printf("兩個(gè)字符串s1和s2沒(méi)有共同的字符存在!\n");}}字符串中反向查找指定字符

在字符串中反向查找指定字符第一次出現(xiàn)位置的基本思想是:從被操作字符串的最后一個(gè)字符開(kāi)始循環(huán)依次取出被操作字符串當(dāng)前位置的字符與指定的字符相比較,若比較相符合則返回該字符的位置;否則進(jìn)行下一輪比較直到被處理的字符串中所有字符取完為止。

例7-16

編制函數(shù)實(shí)現(xiàn)功能:在字符串中反向查找指定的字符,若被查找字符存在則返回字符在字符串中的下標(biāo)序號(hào);若指定的字符在被查找的字符串中不存在,則返回-1;并用相應(yīng)主函數(shù)進(jìn)行測(cè)試。7.2.4字符串中字符的查找int

Rsearch_chr(char

s[],charc){ inti;

for(i=strlen(s)-1;i>=0;i--)

if(s[i]==c) returni; return-1;}

上面程序的函數(shù)Rsearch_chr實(shí)現(xiàn)方法與例7.13程序類(lèi)似,惟一不同的地方是此時(shí)取出字符串中字符時(shí)是從字符串中的最后一個(gè)字符開(kāi)始,字符串中最后一個(gè)字符的下標(biāo)序號(hào)是:strlen(s)-1(字符串的長(zhǎng)度減1)。7.2.4字符串中字符的查找字符串中有效字符的統(tǒng)計(jì)字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2字符串的常用處理方法及標(biāo)準(zhǔn)庫(kù)函數(shù)1)在字符串指定位置插入字符

在字符串指定位置插入一個(gè)字符的基本思想是:首先在字符串中查找指定的位置,然后將字符串中從指定位置以后的所有字符由后向前依次向后移動(dòng)一個(gè)字符位置以騰出所需要的字符插入空間;最后將指定的插入字符拷貝到該指定位置即可。字符的插入包括前插(插入的字符在指定位置原字符之前)和后插(插入的字符在指定位置原字符之后)兩種方式,這兩種方式的基本思想完全一致,不同之處在于字符串部分字符后移時(shí)是否包括指定位置的原字符。

例7-17

編制函數(shù)實(shí)現(xiàn)功能:在字符串的指定字符之前插入另外一個(gè)指定字符,若在字符串中找不到插入位置,則將被插入字符添加到字符串末尾,并用相應(yīng)主函數(shù)進(jìn)行測(cè)試。7.2.5字符串中字符的插入和刪除/*Name:ex07-17.cpp*/#include<stdio.h>#include<string.h>voidmain(){ voidinsertchr(chars[],charpos,charc);chars1[80],pos,ch;

printf("請(qǐng)輸入被處理的字符串:");gets(s1);

printf("請(qǐng)輸入被查找的字符:");pos=getchar(); getchar();

printf("請(qǐng)輸入被插入的字符:");ch=getchar(); puts(s1);insertchr(s1,pos,ch);puts(s1);}voidinsertchr(char

s[],char

pos,charc){ intlast=strlen(s); char*p; p=strchr(s,pos);//使用標(biāo)準(zhǔn)庫(kù)函數(shù)strchr在串s中尋找字符pos

if(p!=NULL)//如果找到插入點(diǎn)

{for(;&s[last]>=p;last--)//所有字符由后向前依次向后移動(dòng)一個(gè)字符位置

s[last+1]=s[last]; *p=c; } else { s[last+1]=s[last];//實(shí)際是后退末尾的結(jié)束符\0

s[last]=c; }}2)在字符串中刪除指定的字符

在字符串中刪除指定字符操作的基本思想是:首先在字符串中查找指定字符的位置,若找到則將字符串中自該位置以后所有字符依次向前移動(dòng)一個(gè)字符位置即可。

例7-18

函數(shù)原型為:voiddeletechr(chars[],charc);,其功能是在字符串中刪除指定字符,若指定字符不存在則顯示相應(yīng)提示信息。請(qǐng)編制該函數(shù)并用相應(yīng)主函數(shù)進(jìn)行測(cè)試。7.2.5字符串中字符的插入和刪除/*Name:ex07-18.cpp*/#include<stdio.h>#include<string.h>voidmain(){ voiddeletechr(chars[],charc);/*聲明*/ chars1[80],ch;

printf("請(qǐng)輸入被處理的字符串:"); gets(s1);

printf("請(qǐng)輸入要?jiǎng)h除的字符:");

ch=getchar(); puts(s1);

deletechr(s1,ch);/*調(diào)用刪除函數(shù)*/ puts(s1);}voiddeletechr(char

s[],charc)/*定義*/{ char*p;

p=strchr(s,c); //找到被刪除字符的位置

if(p!=NULL) strcpy(p,p+1);//字符串(p+1為起始地址)//拷貝到刪除點(diǎn)覆蓋被刪字符

else

printf("'%c'不在'%s'中.\n",c,s);}從字符串的任一位置開(kāi)始處理字符串。在串中刪去某個(gè)字符可以通過(guò)將被刪除字符后所形成的字符串拷貝到字符位置的方法實(shí)現(xiàn)。voiddeletechr(char

s[],charc)/*定義*/{ int

search_chr(char

s[],charc);/*聲明字符查找函數(shù)*/

intpos; pos=search_chr(s,c); //在串s中查找字符c

if(pos!=-1)

for(;s[pos]!='\0';pos++)//刪除點(diǎn)后的所有字符依次向前移動(dòng)一個(gè)字符位置

s[pos]=s[pos+1]; else

printf("'%c'不在'%s'中.\n",c,s);}int

search_chr(char

s[],charc){ inti;

for(i=0;s[i]!='\0';i++)

if(s[i]==c) returni; return-1;}字符串中有效字符的統(tǒng)計(jì)字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2字符串的常用處理方法及標(biāo)準(zhǔn)庫(kù)函數(shù)1)字符串的比較

比較兩個(gè)字符串的基本思想是:從參與比較操作的兩個(gè)字符串的第一個(gè)字符開(kāi)始依次比較相同位置的兩個(gè)對(duì)應(yīng)字符,在下列兩種情況之下結(jié)束比較過(guò)程:兩個(gè)字符串中對(duì)應(yīng)位置字符的ASCII碼不相同;遇到兩字符串中任何一個(gè)字符串的串結(jié)尾字符’\0’;

比較結(jié)束時(shí),用該時(shí)刻兩個(gè)字符串中對(duì)應(yīng)位置字符的ASCII碼差值來(lái)確定兩個(gè)字符串之間的關(guān)系。設(shè)參加比較操作的兩個(gè)字符串分別用s1和s2表示(其中s1表示前串,s2表示后串),則字符串比較結(jié)果的判斷規(guī)則為:7.2.6字符串的比較和字串的查找

例7-19

函數(shù)的原型為:int

strcompare(chars[],chart[]);,其功能是比較兩個(gè)字符串s和t的關(guān)系,比較規(guī)則如上所示,請(qǐng)編制函數(shù)strcompare并用相應(yīng)主函數(shù)進(jìn)行測(cè)試。

7.2.6字符串的比較和字串的查找/*Name:ex07-19.cpp*/#include<stdio.h>voidmain(){ int

strcompare(chars[],chart[]); chars1[80],s2[80];

intresult;

printf("輸入比較的前串s1:"); gets(s1);

printf("輸入比較的后串s2:"); gets(s2); result=strcompare(s1,s2);

if(result>0) printf("s1>s2(前串大于后串)\n"); elseif(result<0) printf("s1<s2(前串小于后串)\n"); else printf("s1=s2(前串等于后串)\n");}int

strcompare(chars[],chart[]){ inti;

for(i=0;s[i]==t[i];i++)

if(s[i]=='\0') return0; returns[i]-t[i];}比較函數(shù)strcompare中,循環(huán)執(zhí)行的條件是s[i]==t[i],即當(dāng)遇到兩個(gè)ASCII碼值不相同的字符時(shí)循環(huán)結(jié)束,返回該位置兩個(gè)字符ASCII碼值之差(s[i]-t[i]);當(dāng)循環(huán)條件成立時(shí)則判斷是否兩個(gè)字符串同時(shí)結(jié)束,若是同時(shí)結(jié)束則返回?cái)?shù)值0表示兩個(gè)字符串相同;當(dāng)對(duì)應(yīng)位置的兩個(gè)字符既相同且又不是結(jié)尾符號(hào)時(shí),則取出下一對(duì)字符進(jìn)行比較。

在標(biāo)準(zhǔn)函數(shù)庫(kù)中提供了相應(yīng)的字符串比較函數(shù),函數(shù)的原型為:

int

strcmp(constchar*string1,constchar*string2);

函數(shù)的功能是:比較兩個(gè)字符串string1和string2的關(guān)系,返回值確定規(guī)則為:如果string1大于string2,則返回值大于0;如果string1等于string2,返回值等于0;如果string1小于string2,返回值小于0。

特別需要提醒讀者注意的是,由于字符串本質(zhì)上是字符數(shù)組,不能直接作為整體進(jìn)行操作,所以不能用類(lèi)似if(s1>s2)的方式直接對(duì)字符串s1和s2進(jìn)行比較,而應(yīng)該使用串比較函數(shù)。

例7-20

使用標(biāo)準(zhǔn)庫(kù)函數(shù)比較兩個(gè)字符串。

7.2.6字符串的比較和字串的查找/*Name:ex07-20.cpp*/#include<stdio.h>#include<string.h>voidmain(){ chars1[80],s2[80];

intresult;

printf("輸入比較的前串s1:"); gets(s1);

printf("輸入比較的后串s2:"); gets(s2); result=strcmp(s1,s2);//使用標(biāo)準(zhǔn)庫(kù)函數(shù)比較字符串s1和s2

if(result>0) printf("s1>s2(前串大于后串)\n"); elseif(result<0) printf("s1<s2(前串小于后串)\n"); else printf("s1=s2(前串等于后串)\n");}2)有長(zhǎng)度限制的字符串比較

程序設(shè)計(jì)中,子串指的是字符串中從某一位置開(kāi)始連續(xù)的若干個(gè)字符構(gòu)成的一個(gè)字符序列,對(duì)應(yīng)于子串將包含子串的字符串稱之為主串。一個(gè)子串也可以和主串是完全相同的,即子串由主串所有的字符構(gòu)成。因?yàn)樽哟锌赡苁侵鞔囊粋€(gè)連續(xù)的局部,為了在串中查找子串就必須研究比較兩個(gè)字符串中從某個(gè)位置開(kāi)始的有限長(zhǎng)連續(xù)字符序列的問(wèn)題。為了簡(jiǎn)單起見(jiàn),假設(shè)開(kāi)始位置為字符串的首字符(如需要從字符串中的其他位置開(kāi)始,只需用地址的方式表示出起始點(diǎn)),即討論比較兩個(gè)字符串前n個(gè)字符構(gòu)成的字符序列的關(guān)系。比較兩個(gè)字符串前n個(gè)字符關(guān)系的與比較兩個(gè)字符串關(guān)系的基本思想完全一致,判斷比較結(jié)果的規(guī)則也相同,所不同的是多了一個(gè)比較的長(zhǎng)度限制。7.2.6字符串的比較和字串的查找

例7-21

函數(shù)的原型為:int

strncompare(chars[],chart[],intn);,其功能是比較兩個(gè)字符串s和t前n個(gè)字符構(gòu)成的字符串的關(guān)系,比較規(guī)則如下所示,請(qǐng)編制函數(shù)strncompare并用相應(yīng)主函數(shù)進(jìn)行測(cè)試。7.2.6字符串的比較和字串的查找int

strncompare(char

s[],char

t[],intn){ inti;

for(i=0;s[i]==t[i];i++)

if(s[i]=='\0'||--n<=0) return0; returns[i]-t[i];}

在比較函數(shù)strncompare中,循環(huán)執(zhí)行的條件是s[i]==t[i],即當(dāng)遇到兩個(gè)ASCII碼值不相同的字符時(shí)循環(huán)結(jié)束,返回該位置兩個(gè)字符ASCII碼值之差(s[i]-t[i]);當(dāng)循環(huán)條件成立時(shí)則判斷是否兩個(gè)字符串同時(shí)結(jié)束或則是否已經(jīng)比較過(guò)了指定的字符個(gè)數(shù),在兩個(gè)字符串同時(shí)結(jié)束或則已經(jīng)比較過(guò)了指定的字符個(gè)數(shù)時(shí)返回?cái)?shù)值0表示兩個(gè)字符串前n個(gè)字符(或者兩個(gè)字符串)相同;當(dāng)對(duì)應(yīng)位置的兩個(gè)字符既相同,但該位置字符不是字符串結(jié)尾符號(hào)而且規(guī)定的字符比較次數(shù)又未完成時(shí),則取出下一對(duì)字符進(jìn)行比較。7.2.6字符串的比較和字串的查找

標(biāo)準(zhǔn)函數(shù)庫(kù)中提供了相應(yīng)的字符串比較函數(shù),函數(shù)的原型為:

int

strncmp(constchar*string1,constchar*string2,size_tcount);

函數(shù)的功能是:比較連個(gè)字符串string1和string2中至多前count個(gè)字符的關(guān)系,返回值確定規(guī)則為:如果string1大于string2,則返回值大于0;如果string1等于string2,返回值等于0;如果string1小于string2,返回值小于0。

例7-22

使用標(biāo)準(zhǔn)庫(kù)函數(shù)比較兩個(gè)字符串前n個(gè)字符。

7.2.6字符串的比較和字串的查找/*Name:ex07-22.cpp*/#include<stdio.h>#include<string.h>voidmain(){ int

strncompare(char

s[],char

t[],intn); chars1[80],s2[80];

int

len,result;

printf("輸入比較的前串s1:"); gets(s1);

printf("輸入比較的后串s2:"); gets(s2);

printf("輸入如比較長(zhǎng)度:");

scanf("%d",&len); result=strncmp(s1,s2,len);//使用標(biāo)準(zhǔn)庫(kù)函數(shù)strncmp比較s1和s2的前l(fā)en個(gè)字符

if(result>0) printf("s1>s2(前串大于后串)\n"); elseif(result<0) printf("s1<s2(前串小于后串)\n"); else printf("s1=s2(前串等于后串)\n");}3)字符串中子串的查找

在字符串中查找指定子串的基本思想是:首先在主串中查找子串的首字符,如果找到則比較主串中其后連續(xù)的若干個(gè)字符是否與參與比較的子串相同。如果相同則返回子串首字符在主串中出現(xiàn)的位置(序號(hào)或地址);否則在主串中向后繼續(xù)查找直到在主串中再也找不到子串的首字符為止;當(dāng)指定查找的子串在主串中不存在時(shí),函數(shù)則返回-1(序號(hào)方式)或NULL(地址方式)。

例7-23

函數(shù)的原型為:int

findsubstr(chars[],chart[]);,其功能是在實(shí)現(xiàn)在s串中查找子串t第一次出現(xiàn)的起始位置,若t是s的子串返回t在s中第一次出現(xiàn)的下標(biāo)序號(hào),否則返回-1。編制該函數(shù)并用相應(yīng)主函數(shù)進(jìn)行測(cè)試。7.2.6字符串的比較和字串的查找

上面函數(shù)findsubstr中,對(duì)于字符串s和t首先調(diào)用函數(shù)search_chr(在7.2.4中介紹)在以&s[i]開(kāi)始的字符串中查找t串的首字符t[0];然后在t串首字符找到的情況下調(diào)用函數(shù)strncompare(在7.2.6中介紹)比較兩個(gè)字符串&s[i]和t前l(fā)en(len是t串長(zhǎng)度)個(gè)字符構(gòu)成的字符序列,若比較結(jié)果為0則返回此時(shí)的i值表示子串的起始地址,當(dāng)比較結(jié)果不為0時(shí)在字符串s中向后移動(dòng)一個(gè)位置繼續(xù)進(jìn)行比較;若某一次在以&s[i]開(kāi)始的字符串中查找t串的首字符t[0]的結(jié)果為-1,則表示字符串t不是字符串s的子串。

7.2.6字符串的比較和字串的查找

對(duì)于子串的查找還可以從另外一個(gè)方面去考慮,即從主串中的第一個(gè)字符開(kāi)始,以后每次依次向后移動(dòng)一個(gè)字符的位置,取出主串中與子串長(zhǎng)度相等的前幾個(gè)字符與子串比較。若相等則返回子串在主串中的起始位置,否則繼續(xù),直到主串查找完畢為止。若主串中不存在子串,返回-1。

例7-24

重寫(xiě)例7.23程序以實(shí)現(xiàn)上述基本思想。/*Name:ex07.24.cpp主函數(shù)和strncompare函數(shù)同例7.23*/int

findsubstr(chars[],chart[]){ int

strncompare(char

s[],char

t[],intn);

inti=0,len=strlen(t);

while(strncompare(&s[i],t,len)!=0&&s[i]!='\0') i++; returns[i]!='\0'?i:-1;}7.2.6字符串的比較和字串的查找字符串中有效字符的統(tǒng)計(jì)字符串的復(fù)制字符串的連接字符串中字符的查找字符串中字符的插入和刪除字符串的比較和子串的查找字符串中子串的插入和刪除字符串與二維字符數(shù)組7.2字符串的常用處理方法及標(biāo)準(zhǔn)庫(kù)函數(shù)1)字符串中子串的插入

在字符串中插入子串基本思想和在字符串中指定位置插入字符類(lèi)似,仍然是首先在字符串中找到插入位置,然后移動(dòng)插入點(diǎn)之后的所有字符以騰出插入位置,最后進(jìn)行插入操作。與插入一個(gè)字符不同的是要按欲插入的子串長(zhǎng)度騰出足夠的插入位置,也就是說(shuō),在準(zhǔn)備插入空位時(shí)需要將字符向后移動(dòng)過(guò)足夠的跨距而不是一個(gè)字符位置。

例7-25

函數(shù)的原型為:voidinsertsubstr(chars[],chart[]);,其功能是實(shí)現(xiàn)子串插入功能,插入點(diǎn)為子串的首字符在主串中第一次出現(xiàn)的位置,若滿足的要求的插入點(diǎn)不存在則給出相應(yīng)提示信息。用相應(yīng)主函數(shù)對(duì)子串插入函數(shù)進(jìn)行測(cè)試。

7.2.7字符串中字串的插入和刪除 上面程序的insertsubstr函數(shù)中,用變量i記住s串的結(jié)尾位置,調(diào)用字符查找函數(shù)用變量jsearch_chr查找t串首字符t[0]在串s中第一次出現(xiàn)的位置并將該序號(hào)賦值給變量j;在t[0]在s中存在的情況下使用表達(dá)式s[i+len-1]=s[i];從串s的結(jié)尾符號(hào)開(kāi)始依次將字符向后移動(dòng)插入t串所需要的長(zhǎng)度,移動(dòng)操作一直進(jìn)行到移動(dòng)插入點(diǎn)字符為止(用條件i>=j控制,如采用i>j則表示后插入);最后通過(guò)循環(huán)將字符串t的所有字符依次拷貝到所騰出的空間。

例7-26

重寫(xiě)例7.25程序,其中子串插入函數(shù)insertsubstr的實(shí)現(xiàn)中要求充分利用

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論