C語(yǔ)言程序設(shè)計(jì)課件:字符串_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件:字符串_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件:字符串_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件:字符串_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件:字符串_第5頁(yè)
已閱讀5頁(yè),還剩53頁(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ǔ)言程序設(shè)計(jì)目錄content字符串的基本概念1字符串相關(guān)庫(kù)函數(shù)及其使用2單個(gè)字符串的處理3多個(gè)字符串的處理4帶參數(shù)的main函數(shù)5綜合舉例6ASCII字符集(127個(gè))字母:大寫字母A~Z,小寫字母a~z數(shù)字:0~9特殊字符(29個(gè)):

!#&*()-+=_,./?<>:;’”|\[]{}~`^空格符:空格、水平制表符(tab)、垂直制表符、換行、換頁(yè)不能顯示的字符:空字符('\0')、退格('\b')、回車('\r')等字符:任何計(jì)算機(jī)系統(tǒng)都使用一個(gè)可被本系統(tǒng)識(shí)別的字符集,該字符集包括了

人們常用的字母、數(shù)字以及諸如句號(hào)、逗號(hào)、括號(hào)之類的特殊字符。

國(guó)際上較通用的字符集是”美國(guó)標(biāo)準(zhǔn)信息交換代碼”(TheAmericanStandardCodeforInformationInterchange,ASCII)字符集,已被計(jì)算機(jī)等行業(yè)廣泛接受為標(biāo)準(zhǔn)。7.1字符串的基本概念7.1.1字符字符類型字符表示字符含義ASCII碼值“\ddd”表示“\xhh”表示字母‘a(chǎn)’字母(a)97\141\x61數(shù)字‘1’數(shù)字(1)49\061\x31特殊字符‘!’感嘆號(hào)符(!)33\041\x21‘\’’單引號(hào)符(’)96\140\x60‘\”’雙引號(hào)符(”)34\042\x22‘\\’反斜線符(\)92\134\x5C空格符‘\n’回車換行10\012\x0A‘\f’走紙換頁(yè)12\014\x0C不能顯示的字符‘\0’空字符0\000\x00‘\b’退格8\010\x08‘\r’回車13\015\x0D7.1.1字符數(shù)字字符

數(shù)值型數(shù)字

之間的關(guān)系:1)

chara='3';intb=3;以字符型數(shù)據(jù)輸出‘3’以整型數(shù)據(jù)輸出51整數(shù)運(yùn)算

1+1=2字符運(yùn)算

‘1’+‘1’=0x31+0x31=0x622)

chara[20]="10000";intb=10000;內(nèi)存:

數(shù)字字符按ASCII值轉(zhuǎn)換為二進(jìn)制存儲(chǔ)在存儲(chǔ)空間中,而數(shù)值型數(shù)字則直接按二進(jìn)制形式存儲(chǔ)在存儲(chǔ)空間中。

一般用數(shù)值型數(shù)字表示數(shù)字的變量占用較小的內(nèi)存。3內(nèi)存:0x330x27100x3130303030

字符型數(shù)據(jù)和整型數(shù)據(jù)可以通用,相當(dāng)于對(duì)字符的ASCII碼進(jìn)行操作7.1.2字符串字符串:由一對(duì)雙引號(hào)括起的字符序列,字符串中可以包括字母、數(shù)字以

及各種各樣的字符等等。"zhangsan" 表示一個(gè)人名"hust.wuhan.china"表示一個(gè)地址"87243092"

表示一個(gè)電話號(hào)碼可以使用字符數(shù)組或字符指針來(lái)對(duì)字符串進(jìn)行處理字符數(shù)組:charcolor[20]="blue";字符指針:char*colorPtr="blue";使用字符指針與字符型數(shù)組本質(zhì)上是具有相通性的,都是對(duì)字符串的地址進(jìn)行操作,而使用字符指針更加方便易懂87243092\0e.g.在有效字符串的末尾存放‘\0’作為字符串結(jié)束的標(biāo)志。7.1.3字符數(shù)組與字符指針字符數(shù)組:元素類型為字符型的數(shù)組,字符數(shù)組中的一個(gè)元素存放一個(gè)字符。字符數(shù)組的定義方法:charstring[20];

一個(gè)長(zhǎng)度為n的字符數(shù)組可以存儲(chǔ)長(zhǎng)度不超過(guò)n-1個(gè)字符的字符串,因?yàn)樵谟行ё址哪┪矔?huì)存入一個(gè)空字符‘\0’,但它并不是字符串的一部分,所以字符串的最大長(zhǎng)度始終比數(shù)組長(zhǎng)度小1。7.1.3字符數(shù)組與字符指針字符數(shù)組在處理字符串時(shí)的初始化方法方法1:逐個(gè)元素賦初值charstring[20]={'s','t','r','o','n','g','\0'};string[0]='s';string[1]='t';string[2]='r'; . .string[6]='\0';在指定初值時(shí),必須在最后一個(gè)值之后必須明確地寫上‘\0’方法2:整個(gè)字符串賦初值charstring[20]="hello";自動(dòng)在末尾加有'\0'字符,作為一個(gè)結(jié)束標(biāo)志strong\0在內(nèi)存中的存儲(chǔ)狀態(tài)hello\0等效#include<stdio.h>intlength(char*string);voidmain(){intm; chara[20]; gets(a); m=length(a); printf("Thelengthofstringais%d\n",m);}intlength(char*string){inti=0;while(string[i]!='\0') i++;return(i);}7.1.3——一維字符數(shù)組與單個(gè)字符串例7.1計(jì)算字符串長(zhǎng)度的程序gets函數(shù)用于輸入可以包含空格的字符串

運(yùn)行結(jié)果:Helloworld!Thelengthofstringais12統(tǒng)計(jì)字符的個(gè)數(shù),如果字符不等于‘\0’則循環(huán)7.1.3——二維字符數(shù)組與多個(gè)字符串例7.2二維字符數(shù)組在處理多個(gè)字符串時(shí)的的定義和初始化方法多個(gè)字符串的顯式初始化[方法一] charstring[3][10]={"pascal", "cobol", "fortran"};[方法二]charstring[3][20];inti;for(i=0;i<3;i++){scanf("%s",string[i]);}for(i=0;i<3;i++){printf("%s\n",string[i]);}pascal\0

cobol\0

fortran\0

利用scanf函數(shù)進(jìn)行循環(huán)輸入實(shí)現(xiàn)多個(gè)字符串的初始化存儲(chǔ)狀態(tài):7.1.3——字符指針字符指針:即字符型指針,它是一個(gè)指針變量,

可以方便地對(duì)字符串中的字符進(jìn)行處理。字符指針初始化:

方法1:直接使用字符串常量作為初始值 char*string="wearefamily!";

方法2:將一個(gè)字符串常量賦予一個(gè)指針 char*p; p="cprogram";p字符指針的定義方法:char*string;cprogram\0由于這塊區(qū)域已經(jīng)固定,因此如果要處理該常量字符串時(shí),要保證處理后的字符串長(zhǎng)度不能超過(guò)初始的字符串長(zhǎng)度,否則會(huì)修改初始字符串所在區(qū)域后面的數(shù)據(jù),有可能會(huì)影響系統(tǒng)的運(yùn)行。系統(tǒng)開辟一塊區(qū)域存儲(chǔ)這個(gè)字符串將首地址賦予指針7.1.3——字符指針在使用字符數(shù)組和字符指針時(shí)應(yīng)注意的問(wèn)題:字符指針:字符數(shù)組:char*p; scanf("%s",p);scanf(“%s”,p)是將輸入的字符串存放在p所指向的地址中,在p未賦值之前,執(zhí)行scanf(“%s”,p)是錯(cuò)誤的因?yàn)閚ame是個(gè)地址常量,系統(tǒng)不允許向它賦值,正確的初始化形式為charname[20]="cprogram";charname[20];name="cprogram";7.1.3——字符指針例7.3向字符指針賦字符串直接使用字符串常量作為初始值進(jìn)行初始化#include<stdio.h>voidmain(){ char*s="good"; char*p; while(*s!='\0') printf("%c",*s++); printf("\n"); p="morning"; while(*p!='\0') printf("%c",*p++); printf("\n");}

運(yùn)行結(jié)果:goodmorning將一個(gè)字符串常量賦予一個(gè)指針完成字符串的初始化7.1.3——字符指針例7.4輸入一行字符串,將其逆序輸出利用字符指針將單個(gè)字符串在函數(shù)間傳遞

運(yùn)行結(jié)果: Enteralineoftext: Helloworld! Thelineprintedbackwardis: !dlrowolleH#include<stdio.h>voidreverse(char*sPtr);voidmain(){ chars[80]; printf("Enteralineoftext:\n"); gets(s); printf("\nThelineprintedbackwardis\n"); reverse(s);}voidreverse(char*sPtr){ if(sPtr[0]=='\0') { return; } else { reverse(&sPtr[1]); putchar(sPtr[0]); }}reverse函數(shù)遞歸調(diào)用,從最后的字符開始,實(shí)現(xiàn)逆序輸出7.2字符串相關(guān)庫(kù)函數(shù)及其使用相關(guān)庫(kù)函數(shù)函數(shù)聲明函數(shù)功能字符串輸入輸出函數(shù)char*gets(char*s);字符串輸入intputs(constchar*s);

字符串輸出字符串轉(zhuǎn)換函數(shù)doubleatof(constchar*nPtr);

字符串轉(zhuǎn)換為浮點(diǎn)數(shù)intatoi(constchar*nPtr);字符串轉(zhuǎn)換為整數(shù)longatol(constchar*nPtr);字符串轉(zhuǎn)換為長(zhǎng)整型voiditoa(intn,chars[],intradix);整數(shù)n轉(zhuǎn)換為字符串字符串處理函數(shù)char*strcpy(char*dest,char*src);復(fù)制字符串char*strcat(char*dest,char*src);連接字符串字符串比較函數(shù)intstrcmp(char*s1,char*s2);比較字符串其他函數(shù)intstrlen(char*s);求字符串長(zhǎng)度char*strupr(char*str);

char*strlwr(char*str);字符串大小寫轉(zhuǎn)換char*strstr(char*s1,char*s2);指定字符串在給定字符串中第一次出現(xiàn)的位置7.2.1字符串輸入輸出函數(shù)字符串輸入函數(shù)字符串輸出函數(shù)char*gets(char*s);intputs(constchar*s);功能:從鍵盤輸入一個(gè)字符串到字符數(shù)組功能:將一個(gè)字符串輸出到終端執(zhí)行:charstring[80];gets(string);鍵盤輸入:good↙執(zhí)行:charstring[]={"hello"};puts(string);7.2.2字符串轉(zhuǎn)換函數(shù)doubleatof(constchar*nPtr);longatol(constchar*nPtr);intatoi(constchar*nPtr);voiditoa(intn,chars[],intradix);功能:將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)的函數(shù)功能:將字符串轉(zhuǎn)換為整數(shù)的函數(shù)功能:將字符串轉(zhuǎn)換為長(zhǎng)整形的函數(shù)功能:將整數(shù)n轉(zhuǎn)換為字符串的函數(shù)7.2.2字符串轉(zhuǎn)換函數(shù)#include<stdio.h>#defineLENGTH6voidreverse(char*s);voiditoa(intn,char*s);voidmain(void){intn;chars[LENGTH];printf("inputainteger:");scanf(“%d”,&n);itoa(n,s);printf("string:%s\n",s);}voiditoa(intn,char*s){inti,sign;if((sign=n)<0){n=-n;}i=0;do

{

s[i++]=n%10+'0';}(while((n/=10)>0);if(sign<0){s[i++]='-';}s[i]='\0';reverse(s);}voidreverse(char*s){inti,j,k;for(i=0,j=strlen(s)-1;i<j;i++,j--){k=s[i];s[i]=s[j];s[j]=k;}}將輸入的整數(shù)n轉(zhuǎn)換為字符串字符串翻轉(zhuǎn)函數(shù)n為負(fù)值,轉(zhuǎn)換為正數(shù)

運(yùn)行結(jié)果:inputainteger:-102string:-102

例7.5將某一個(gè)整數(shù)轉(zhuǎn)換為相對(duì)應(yīng)的數(shù)字串7.2.3字符串處理函數(shù)字符串復(fù)制函數(shù)char*strcpy(char*dest,char*src);功能:將指針src所指向的字符串復(fù)制到指針dest所指向的內(nèi)存區(qū)域

中,函數(shù)返回dest所指向的字符串的首地址。char*strcpy(char*dest,char*src){ char*temp=dest; while((*dest++=*src++)!='\0') ; returntemp;}7.2.3字符串處理函數(shù)#include<string.h>#include<stdio.h>voidmain(){charstr[80]="TurboC++";char*p="BorlandC++";strcpy(str,p);strcpy(str,"VisualC++");printf("%s\n",str);}第一次調(diào)用strcpy的復(fù)制過(guò)程如圖(a)所示第一次調(diào)用strcpy的復(fù)制過(guò)程如圖(b)所示例7.6字符串復(fù)制函數(shù)strcpy的使用7.2.3字符串處理函數(shù)字符串連接函數(shù)char*strcat(char*dest,char*src);功能:strcat函數(shù)的功能是將兩個(gè)字符串連接。具體的就是把字符

串2或者字符數(shù)組2中的字符串連接到字符數(shù)組1中的字符串

的后面,結(jié)果存放在字符數(shù)組1中。char*strcat(char*dest,char*src){ int*temp=dest; while(*dest!='\0')dest++; while(*src!='\0')*dest++=*src++;

returntemp;}charstring1[80]={"goodmorning,"};charstring2[]={"everyone!"};strcat(string1,string2);printf("%s",string1);字符串連接函數(shù)strcat的使用

運(yùn)行結(jié)果:goodmorning,everyone!7.2.3字符串處理函數(shù)字符數(shù)組1必須足夠大,以便容納連接后的新字符串連接前兩個(gè)字符串的后面都有一個(gè)'\0',連接時(shí)將字符串1后面的'\0'取消,只在新串最后保留一個(gè)'\0'7.2.4字符串比較函數(shù)字符串比較函數(shù)intstrcmp(char*s1,char*s2);intstrcmp(char*s1,char*s2){ for(;*s1==*s2&&*s1;s1++,s2++) ;return*s1-*s2;}(1)如果字符串1中的字符ASCII碼較大,則認(rèn)為字符串1大于字符串2,函數(shù)返回值為一正整數(shù)。(2)如果字符串1中的字符ASCII碼較小,則認(rèn)為字符串1小于字符串2,函數(shù)返回值為一負(fù)整數(shù)。(3)如果全部字符相等,則認(rèn)為兩字符串相等,函數(shù)返回值為0。

字符串比較,即對(duì)兩個(gè)字符串從第一個(gè)字符開始逐個(gè)字符相比(按照ASCII碼大小比較),直到出現(xiàn)第一個(gè)不同的字符或遇到’\0’為止。#include<string.h>#include<stdio.h>voidmain(){charstr[80]="Hello";char*p="Hello";if(strcmp(str,p)==0) printf("twostringsequal\n");if(strcmp(str,"HELLO")>0)printf("string(str)islarger\n");}第一次調(diào)用strcmp的復(fù)制過(guò)程如圖(a)所示第一次調(diào)用strcmp的復(fù)制過(guò)程如圖(b)所示例7.7字符串比較函數(shù)strcmp的使用7.2.4字符串比較函數(shù)7.2.5其它函數(shù)求字符串的長(zhǎng)度函數(shù)字符串大小寫轉(zhuǎn)換函數(shù)intstrlen(char*s);char*strupr(char*str);char*strlwr(char*str);intstrlen(char*s){ char*p=s; while(*p!='\0') p++; returnp-s;}功能:strlwr函數(shù)將字符串中的大寫字母換成小寫字母。 strupr函數(shù)將字符串中的小寫字母換成大寫字母。功能:求有效字符串的長(zhǎng)度7.2.5其它函數(shù)char*strlwr(char*str){char*str2=str;while(*str2!='\0'){if(*str2>='A'&&*str2<='Z') *str2+=0x20;str2++;}returnstr;}char*strupr(char*str){char*str1=str;while(*str1!='\0'){ if(*str1>='a'&&*str1<='z') *str1-=0x20;str1++;}returnstr;}字符串大寫轉(zhuǎn)換函數(shù)字符串小寫轉(zhuǎn)換函數(shù)‘a(chǎn)’~’z’的ASCII碼值為0x61~0x7A,‘A’~’Z’的ASCII碼值為0x41~0x5A,相差0x207.2.5其它函數(shù)查找指定字符串在給定字符串中第一次出現(xiàn)的函數(shù)char*strstr(char*s1,char*s2);功能:這個(gè)函數(shù)在s1中查找整個(gè)s2第一次出現(xiàn)的起始位置,并返回一個(gè)指向

該位置的指針。如果s2并沒(méi)有完整地出現(xiàn)在s1的任何地方,函數(shù)將返

回一個(gè)NULL指針。如果第二個(gè)參數(shù)是一個(gè)空字符串,函數(shù)就返回s1。7.2.5其它函數(shù)例7.8在給定字符串中查找子串最后(最右)一次出現(xiàn)的位置#include<stdio.h>#include<string.h>char*my_strrstr(char*s1,char*s2){char*last;char*current;last=NULL; if(*s2!='\0'){current=strstr(s1,s2);while(current!=NULL){last=current;current=strstr(last+1,s2);}}returnlast;}調(diào)用函數(shù)strstr查找s2在s1中第一次出現(xiàn)的位置,找到,返回找到的位置,否則,返回NULL每找到字符串,指向它的其始位置,然后查找該字符串下一個(gè)匹配位置7.3單個(gè)字符串的處理inta[n];chars[n];數(shù)組名數(shù)組長(zhǎng)度字符串首地址由于‘\0’作為字符串的結(jié)束標(biāo)志,所以其長(zhǎng)度已經(jīng)隱藏在其中

一般情況下,字符串的賦值需要通過(guò)輸入輸出函數(shù)或者標(biāo)準(zhǔn)庫(kù)函數(shù)來(lái)實(shí)現(xiàn);而常量字符串可以采用更為簡(jiǎn)潔的方法,即直接將常量字符串賦予一個(gè)指針。

一般單個(gè)字符串可以利用字符指針(動(dòng)態(tài)內(nèi)存分配)、字符數(shù)組來(lái)處理,而常量字符串則可以直接使用字符指針進(jìn)行處理。定義函數(shù)參數(shù)傳遞數(shù)組字符串對(duì)字符串進(jìn)行處理時(shí)與一般數(shù)組的不同之處:7.3——利用指針處理單個(gè)常量字符串

char*strchr1(char*str,charch){char*temp=NULL; for(;*str!='\0';str++)if(*str==ch) { temp=str; break; } returntemp;}例7.9在給定字符串中查找特定的字符#include<stdio.h>#include<string.h>char*strchr1(char*str,charch);voidmain(){char*string="thisisastring"; char*pstr,ch='c'; pstr=strchr1(string,ch);if(pstr) printf("thecharacter%cisattheposition: %d\n",ch,pstr-string+1); else printf("thecharacter%cnotfound\n",ch);}對(duì)常量字符串的處理字符串的結(jié)束標(biāo)志'\0'

運(yùn)行結(jié)果:

thecharactercnotfound7.3——利用字符數(shù)組處理單個(gè)字符串例7.10刪除給定字符串中的數(shù)字字符保存字符串的首地址使用字符數(shù)組名作為實(shí)參進(jìn)行參數(shù)傳遞

運(yùn)行結(jié)果:

inputstring:Ihave12dreamsIhavedreams#include<stdio.h>#include<string.h>char*delnum(char*s);voidmain(){ charstring[80]; printf("inputstring:\n"); gets(string); puts(delnum(string));}char*delnum(char*s){inti;char*temp=s;for(i=0;s[i]!='\0';){ if(s[i]>='0'&&s[i]<='9') strcpy(s,s+1); else s++;}returntemp;}7.3——利用動(dòng)態(tài)內(nèi)存分配處理單個(gè)字符串內(nèi)存分配靜態(tài)內(nèi)存分配動(dòng)態(tài)內(nèi)存分配void*malloc(unsignedsize);voidfree(void*ptr);編譯器在處理程序源代碼時(shí)(編譯時(shí))分配程序執(zhí)行時(shí)調(diào)用運(yùn)行時(shí)刻庫(kù)函數(shù)進(jìn)行分配內(nèi)存是計(jì)算機(jī)系統(tǒng)的重要資源之一,必須有效地加以管理以求得最佳使用效率,而動(dòng)態(tài)內(nèi)存技術(shù)是有效管理內(nèi)存資源的最好方法。利用malloc()函數(shù)在堆區(qū)中開辟內(nèi)存空間,并將該內(nèi)存空間的首地址存放在指針中返回,當(dāng)該字符串使用完后,應(yīng)立即用配對(duì)的標(biāo)準(zhǔn)庫(kù)函數(shù)free()釋放這一內(nèi)存空間7.3——利用動(dòng)態(tài)內(nèi)存分配處理單個(gè)字符串例7.11刪除字符串中除了前導(dǎo)*外的其他*號(hào)保留前導(dǎo)的*號(hào)

運(yùn)行結(jié)果:Enterastring:****A*BC*DEF********ABCDEF#include<stdio.h>#include<stdlib.h>#include<string.h>voiddel(char*s,char*p);voidmain(){ charstr[20],*p; printf("Enterastring:\n"); gets(str);if((p=(char*)malloc(strlen(str)+1))==NULL)

{ printf("\nnotenoughmemorytoallocate buffer!"); exit(1); } del(str,p); strcpy(str,p);free(p); printf("%s\n",str); getch();}voiddel(char*s,char*p){ while(*s&&*s=='*') { *p=*s;p++;s++;} while(*s)

{ if(*s!='*') { *p=*s;p++; } s++; } *p='\0';}動(dòng)態(tài)內(nèi)存分配將處理后的字符串占用的內(nèi)存釋放掉7.4多個(gè)字符串的處理多個(gè)字符串

與單個(gè)字符串類似的是,一般多個(gè)字符串可以利用字符指針數(shù)組(動(dòng)態(tài)內(nèi)存分配)、多維字符數(shù)組來(lái)處理,而多個(gè)常量字符串則可以直接使用字符指針數(shù)組處理。單個(gè)字符串字符指針字符數(shù)組字符指針數(shù)組多維字符數(shù)組#include<stdio.h>#include<string.h>voidsortstr(char**v,intn);voidmain(){ char*proname[]={"pascal","basic","cobol","prolog","lisp"}; inti; sortstr(proname,5); for(i=0;i<5;i++) printf("%s\n",proname[i]);}7.4——利用字符指針數(shù)組處理多個(gè)常量字符串例7.12用字符指針數(shù)組處理多個(gè)字符串的排序問(wèn)題字符指針數(shù)組用來(lái)存儲(chǔ)多個(gè)常量字符串voidsortstr(char**v,intn){inti,j;char*temp;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++){ if(strcmp(v[i],v[j])>=0){ temp=v[i]; v[i]=v[j]; v[j]=temp;}}}

運(yùn)行結(jié)果:

basiccobollisppascalprolog形參v實(shí)質(zhì)上是一個(gè)二級(jí)指針7.4——利用多維字符數(shù)組處理多個(gè)字符串例7.13使用選擇法對(duì)輸入的字符串進(jìn)行升序排序數(shù)組指針作形參,二維數(shù)組名作實(shí)參#include<stdio.h>#include<string.h>voidinpstr(char(*p)[80],intn);voidsortstr(char(*p)[80],intn);voidoutpstr(char(*p)[80],intn);voidmain(){ charstr[10][80]; inpstr(str,10); sortstr(str,10); outpstr(str,10);}voidsortstr(char(*p)[80],intn){ inti,j; chartemp[80]; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++)if(strcmp(p[i],p[j])>0) { strcpy(temp,p[i]); strcpy(p[i],p[j]); strcpy(p[j],temp);}}voidoutpstr(char(*p)[80],intn){ inti;for(i=0;i<n;i++)puts(p[i]);}voidinpstr(char(*p)[80],intn){inti;for(i=0;i<n;i++)gets(p[i]);}采用選擇法進(jìn)行排序7.4——利用多維字符數(shù)組處理多個(gè)字符串例7.13使用選擇法對(duì)輸入的字符串進(jìn)行升序排序輸入: publisher word excel access frontpage outlook onenote infopath powerpoint visio輸出: access excel frontpage infopath onenote outlook powerpoint publisher visio word7.4——利用動(dòng)態(tài)內(nèi)存分配處理多個(gè)字符串例7.14使用冒泡法對(duì)輸入的字符串進(jìn)行升序排序根據(jù)字符串長(zhǎng)度動(dòng)態(tài)分配內(nèi)存,并根據(jù)字符串長(zhǎng)度動(dòng)態(tài)分配內(nèi)存voidmain(){inti;char*str[10]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};chartemp[100]; for(i=0;i<10;i++){ gets(temp); str[i]=(char*)malloc(sizeof(temp)); if(str[i]==NULL){printf("notenoughmemorytoalloctebuffer.\n");exit(1);} strcpy(str[i],temp); }sort(str,10);for(i=0;i<10;i++) puts(str[i]);for(i=0;i<10;i++){if(str[i]!=NULL) free(str[i]);}}7.4——利用動(dòng)態(tài)內(nèi)存分配處理多個(gè)字符串例7.14使用冒泡法對(duì)輸入的字符串進(jìn)行升序排序排序具體實(shí)現(xiàn)的方法是相應(yīng)指針的互換

voidsort(char**str,intn){ inti,j; char*p; for(i=0;i<n-1;i++) { for(j=0;j<n-1-i;j++) { if(strcmp(str[j],str[j+1])>=0) { p=str[j]; str[j]=str[j+1]; str[j+1]=p; } } }}采用冒泡法進(jìn)行排序

運(yùn)行結(jié)果:

運(yùn)行結(jié)果與例7.13相類似7.5帶參數(shù)的main函數(shù)命令行:在操作系統(tǒng)狀態(tài)下,為了執(zhí)行某個(gè)程序而鍵入的一行字符copyfile.txtfile2.txt<CR>命令名命令行參數(shù)結(jié)束符intmain(intargc,char*argv[]){…}argc的值是命令行中包括命令在內(nèi)的所有參數(shù)的個(gè)數(shù)之和。

指針數(shù)組argv[]的各個(gè)指針?lè)謩e指向命令中命令名和各個(gè)參數(shù)的字符串。其中指針argv[0]總是指向命令名字符串,從argv[1]開始依次指向按先后順序出現(xiàn)的命令行參數(shù)字符串。7.5帶參數(shù)的main函數(shù)例7.15打印命令行參數(shù)的程序打印命令行參數(shù),直至遇到NULL指針#include<stdio.h>#include<stdlib.h>intmain(intargc,char**argv){ while(*++argv!=NULL) printf("%s\n",*argv); return1;}C語(yǔ)言程序test帶有三個(gè)命令行參數(shù),其命令行是:testprogl.cprog2.c/p<CR>則argc初始化為4argv初始化為 argv[0]="test"; argv[1]="progl.c"; argv[2]="prog2.c"; argv[3]="/p"; argv[4]=0;例如最后一個(gè)參數(shù)是編譯系統(tǒng)為了程序處理的方便7.6綜合舉例例7.16 輸入若干個(gè)字符串,統(tǒng)計(jì)其中各種字符的個(gè)數(shù),然后按統(tǒng)計(jì)的個(gè)數(shù)從大到

小輸出統(tǒng)計(jì)結(jié)果問(wèn)題分析與設(shè)計(jì):

模塊劃分:該問(wèn)題可以分成四個(gè)功能塊:輸入、統(tǒng)計(jì)、排序和輸出。

數(shù)據(jù)結(jié)構(gòu):多個(gè)字符串采用二維字符數(shù)組存儲(chǔ)charstr[N][80];字符種類分大寫字母、小寫字母、數(shù)字字符、空格、其它字符5種,其個(gè)數(shù)的統(tǒng)計(jì)結(jié)果存放在一維整型數(shù)組中intresult[5];由于排序輸出時(shí)需顯示相對(duì)應(yīng)的字符種類的名稱,將其存放在一二維字符數(shù)組charname[5][20]中。7.6綜合舉例例7.16 輸入若干個(gè)字符串,統(tǒng)計(jì)其中各種字符的個(gè)數(shù),然后按統(tǒng)計(jì)的個(gè)數(shù)從大到

小輸出統(tǒng)計(jì)結(jié)果(1)voidinput(char(*p)[80],intn);

功能:多個(gè)字符串的輸入

形參:二維字符數(shù)組用來(lái)傳遞多個(gè)字符串,n用來(lái)傳遞輸入字符串的個(gè)數(shù)(4)voidoutput(int*presult,intn,char(*pname)[20]);

功能:多個(gè)字符串的輸出(2)voidstatistic(char(*p)[80],intn,int*presult);

功能:統(tǒng)計(jì)字符串中各種字符的個(gè)數(shù)

形參:二維字符數(shù)組用來(lái)傳遞多個(gè)字符串,n用來(lái)傳遞輸入字符串的個(gè)數(shù),一維整型數(shù)組用

來(lái)傳遞各種字符的個(gè)數(shù)(3)voidsort(int*presult,intn,char(*pname)[20]);

功能:多個(gè)字符串的排序

形參:一維整型數(shù)組用來(lái)傳遞各種字符的個(gè)數(shù),n用來(lái)傳遞字符種類數(shù),二維字符數(shù)組用來(lái)

傳遞字符種類名稱函數(shù)原型:#include<stdio.h>#include<string.h>#defineN10voidinput(char(*p)[80],intn);voidstatistic(char(*p)[80],intn,int*presult);voidsort(int*presult,intn,char(*pname)[20]);voidoutput(int*presult,intn,char(*pname)[20]);voidmain(){charstr[N][80];charname[5][20]={"capital","lowercase","digital","space","other"};intresult[5];

input(str,N);statistic(str,N,result);sort(result,5,name);output(result,5,name);return;}7.6綜合舉例例7.16 輸入若干個(gè)字符串,統(tǒng)計(jì)其中各種字符的個(gè)數(shù),然后按統(tǒng)計(jì)的個(gè)數(shù)從大到小輸出統(tǒng)計(jì)結(jié)果宏定義字符串的個(gè)數(shù)N為10多個(gè)字符串的輸入、統(tǒng)計(jì)、排序、輸出函數(shù)聲明函數(shù)調(diào)用7.6綜合舉例統(tǒng)計(jì)結(jié)果初始化為0voidinput(char(*p)[80],intn){inti;

for(i=0;i<n;i++){printf("input%dthstring:\n",i+1);gets(p[i]);}return;}voidstatistic(char(*p)[80],intn,int*presult){inti,j;for(i=0;i<5;i++)presult[i]=0;for(i=0;i<n;i++){for(j=0;p[i][j]!='\0';j++) {if(p[i][j]>='A'&&p[i][j]<='Z') presult[0]++;elseif(p[i][j]>='a'&&p[i][j]<='z') presult[1]++;elseif(p[i][j]>='0'&&p[i][j]<='9') presult[2]++;elseif(p[i][j]=='') presult[3]++;else presult[4]++;}}}多個(gè)字符串輸入函數(shù)多個(gè)字符串統(tǒng)計(jì)函數(shù)7.6綜合舉例選擇法排序多個(gè)字符串輸出函數(shù)多個(gè)字符串排序函數(shù)voidsort(int*presult,intn,char(*pname)[20]){inti,j;inttemp;charstr[20];

for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(presult[i]<presult[j]){temp=presult[i];presult[i]=presult[j];presult[j]=temp;

strcpy(str,pname[i]);strcpy(pname[i],pname[j]);strcpy(pname[j],str);}return;}voidoutput(int*presult,intn,char(*pname)[20]){inti;

for(i=0;i<n;i++)printf("%s:%d\n",pname[i],presult[i]);return;}7.6綜合舉例例7.17 信息錄入系統(tǒng),首先輸入密碼驗(yàn)證正確后,根據(jù)顯示的編號(hào)與姓名,輸入相應(yīng)的個(gè)人信息:生日、年齡以及家庭住址,并能對(duì)個(gè)人信息進(jìn)行修改和顯示。問(wèn)題分析與設(shè)計(jì):

模塊劃分:該問(wèn)題可以分成四個(gè)功能塊:密碼驗(yàn)證、信息初始化輸入、信息修改和信息顯示。

數(shù)據(jù)結(jié)構(gòu):初始密碼設(shè)計(jì)為字符串常量char*word=“hust111”;姓名為字符串常量設(shè)計(jì)為成字符指針數(shù)組;生日和家庭住址也為字符指針數(shù)組;年齡設(shè)計(jì)為一維整形數(shù)組。7.6綜合舉例例7.17 信息錄入系統(tǒng),首先輸入密碼驗(yàn)證正確后,根據(jù)顯示的編號(hào)與姓名,輸入相應(yīng)的個(gè)人信息:生日、年齡以及家庭住址,并能對(duì)個(gè)人信息進(jìn)行修改和顯示。(1)intpassword(char*pword);

功能:驗(yàn)證輸入的密碼是否與初始密碼相同

形參:字符指針用來(lái)傳遞初始密碼字符串函數(shù)原型:(2)voidinit(char*pname[],char*pdate[],intpage[],char*paddress[]);

功能:信息初始化輸入

形參:用來(lái)傳遞個(gè)人信息:姓名、生日、年齡以及家庭住址(3)voidmenu(char*pname[],char*pdate[],intpage[],char*paddress[]);

功能:首先選擇修改什么個(gè)人信息(生日、年齡以及家庭住址),隨后根據(jù)編號(hào)選擇修改哪個(gè)

人的信息,最后進(jìn)行信息的輸入與更新(4)voidshow(char*iname[],char*idate[],intiage[],char*iaddress[],intn); voidshowall(char*iname[],char*idate[],intiage[],char*iaddress[]);

功能:顯示某個(gè)人或全部的個(gè)人信息7.6綜合舉例如果密碼正確則顯示操作界面,否則直接退出例7.17 信息錄入系統(tǒng),首先輸入密碼驗(yàn)證正確后,根據(jù)顯示的編號(hào)與姓名,輸入相應(yīng)的個(gè)人信息:生日、年齡以及家庭住址,并能對(duì)個(gè)人信息進(jìn)行修改和顯示。voidmain(){ intp=1; char*word="hust111"; char*name[3]={"zhangsan","lisi","wangwu"}; char*date[3]; intage[3]; char*address[3]; p=password(word); if(!p) { init(name,date,age,address); menu(name,date,age,address); } else { printf("Thepasswordiswrong!"); return; }}信息初始化錄入后進(jìn)入信息修改操作菜單7.6綜合舉例將用gets得到的字符串轉(zhuǎn)換成整型進(jìn)行存儲(chǔ)密碼驗(yàn)證函數(shù)信息初始化輸入函數(shù) intpassword(char*pword) { char*iword; printf("Pleaseinputthepassword:\n"); gets(iword); return(strcmp(pword,iword)); }信息顯示函數(shù)voidshow(char**iname,char**idate, int*iage,char**iaddress,intn){printf("number:\t%d\n",n);printf("name:\t%s\n",iname[n-1]);printf("date:\t%s\n",idate[n-1]);printf("age:\t%d\n",iage[n-1]);printf("address:%s\n",iaddress[n-1]);}voidinit(char**pname,char**pdate,int*page, char**paddress){inti;charstr[20]; for(i=0;i<3;i++){ printf("number:%d\nname:%s\n",i+1,pname[i]); printf("Pleaseinputthedate:\n"); gets(pdate[i]); printf("Pleaseinputtheage:\n"); gets(str); page[i]=atoi(str); printf("Pleaseinputtheaddress:\n"); gets(paddress[i]);}printf("Initializationcomplete!\n\n");showall(pname,pdate,page,paddress);}7.6綜合舉例1~3分別用來(lái)修改個(gè)人信息中的生日、年齡以及家庭住址;4用來(lái)顯示個(gè)人完整信息;5表示退出系統(tǒng);其他輸入無(wú)效。信息修改函數(shù)

switch(a-'0'){case1:printf("Whichonedoyouwanttomodify?\n\n");printf("number:");gets(str);i=atoi(str);show(pname,pdate,page,paddress,i);printf("Pleaseinputthedate:\n");gets(pdate[i-1]);break; …case4:showall(pname,pdate,page,paddress);getch();break;case5:return;} menu(pname,pdate,page,paddress); }voidmenu(char**pname,char**pdate,int*page, char**paddress){chara,str[20];inti;do{ printf("****menu****\n"); printf("****1.modifydate****\n"); printf("****2.modifyage****\n"); printf("****3.modifyaddress****\n"); printf("****4.show****\n"); printf("****5.exit****\n"); gets(str); a=str[0];}while(a<'1'||a>'5'); 修改操作完成后回到菜單選擇界面,直至選擇exit選項(xiàng)7.6綜合舉例例7.18 關(guān)于通訊錄的字符串應(yīng)用程序。通訊錄中的信息包括有個(gè)人的編號(hào)、姓名和電話號(hào)碼,所需要實(shí)現(xiàn)的功能有通訊錄信息的添加、顯示和修改。問(wèn)題分析與設(shè)計(jì):

模塊劃分:該通訊錄管理程序包括3個(gè)功能模塊,分別是添加個(gè)人信息、顯示所有成員信息、修改個(gè)人信息。

數(shù)據(jù)結(jié)構(gòu):該程序要處理的數(shù)據(jù)是通訊錄中個(gè)人的信息,包括編號(hào)、姓名、電話號(hào)碼。由于個(gè)人信息為字符串的形式,其地址存放在char*data[100][3]的二維字符指針數(shù)組中,最多可包含100人的信息,采用動(dòng)態(tài)內(nèi)存分配的方式進(jìn)行處理。7.6綜合舉例例7.18 關(guān)于通訊錄的字符串應(yīng)用程序。通訊錄中的信息包括有個(gè)人的編號(hào)、姓名和電話號(hào)碼,所需要實(shí)現(xiàn)的功能有通訊錄信息的添加、顯示和修改。(1)intinput(unsignedint(*linepstr)[3],int*n);

功能:添加個(gè)人信息。

形參:unsignedint(*linepstr)[3]數(shù)組指針通過(guò)訪問(wèn)存儲(chǔ)個(gè)人信息地址的字符數(shù)組來(lái)傳

遞個(gè)人信息;int*n用來(lái)傳

溫馨提示

  • 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)論