第十章字符串_第1頁
第十章字符串_第2頁
第十章字符串_第3頁
第十章字符串_第4頁
第十章字符串_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1C語言程序設(shè)計第十章字符串10-2本章內(nèi)容字符串常量、字符串的存儲、字符數(shù)組、字符串指針字符串訪問和輸入輸出字符串處理函數(shù)向函數(shù)傳遞字符串、從函數(shù)返回字符串

指針2023/2/6字符串與字符數(shù)組用雙引號括起的一串字符是字符串常量,C語言自動為其添加'\0'結(jié)束符"Howareyou"Howareyou\0一串以'\0'結(jié)尾的字符在C語言中被看作字符串10-32023/2/6字符串的存儲C語言并沒有為字符串提供任何專門的表示法,完全使用字符數(shù)組和字符指針來處理字符數(shù)組每個元素都是字符類型的數(shù)組charstr[80];Howareyou\0Howareyou\0是字符數(shù)組,但不代表字符串數(shù)組的最后一個元素必須是'\0'10-4字符數(shù)組每個元素都是字符類型的數(shù)組charstring[80];字符串字符串常量是用雙引號括起來的。

例如”Hello”,”Howareyou”c語言中,字符串常量在內(nèi)存中是以字符數(shù)組的形式來存放的。存儲時,系統(tǒng)自動在數(shù)組的最后一個單元上加一個字符‘\0’

。作用是標志字符串的結(jié)束字符數(shù)組VS字符串(1)10-5Howareyou\0Hello\0字符串在用字符數(shù)組存放字符串時,數(shù)組大小應(yīng)定義成字符串實際長度+1字符串結(jié)束標志‘\0’

‘\0’是ASCII碼等于0的字符,它是一個不可顯示的字符,作用只是作為一個標志。有了字符串的結(jié)束標志,系統(tǒng)依據(jù)‘\0’而不是定義時的數(shù)組長度來判斷字符串是否結(jié)束字符數(shù)組VS字符串(2)10-6Howareyou\0Hello\02023/2/6字符數(shù)組的初始化用字符型數(shù)據(jù)對數(shù)組進行初始化charstr[6]={'C','h','i','n','a','\0'};用字符串常量直接對數(shù)組初始化charstr[6]={"China"};charstr[6]="China";charstr[]=“China”;數(shù)組定義長度大于或等于包括‘\0’在內(nèi)的字符個數(shù)10-7字符數(shù)組的初始化C語言允許將字符串作為初值,初始化字符數(shù)組

charweekday[7][10]={“Sunday”,”Monday”,”tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”}與charweekday[][10]={“Sunday”,”Monday”,”tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”}等價10-8字符數(shù)組的初始化C語言允許將字符串作為初值,初始化字符數(shù)組

charstr[]=“hello”;/*字符串作初值時,系統(tǒng)自動在串尾加‘\0’*/等價于:charstr[]={‘h',‘e',‘l',‘l',‘o','\0'};/*人工在串尾加’\0’,占用6個存儲單元*/但不等價于:

char

str[]={‘h',‘e',‘l',‘l',‘o'};

/*串尾沒有’\0’,占用5個存儲單元*/10-9

10但是:charstr[10]=“hello”;等價于:char

str[10]={‘h',‘e',‘l',‘l',‘o'};/*數(shù)組的前5個元素被賦初值,后5個元素均被賦值為0,0和空字符’\0’從數(shù)值上看是完全相同的*/字符數(shù)組的初始化字符串(String)與字符指針字符指針指向字符類型的指針字符指針的定義char*p;字符指針的初始化

char*p=“hello”;以上語句有三方面的含義:定義了char型指針變量p;系統(tǒng)自動在內(nèi)存中創(chuàng)建一個長度為6的的字符數(shù)組存放該字符串,最后一位存放‘\0’,將字符數(shù)組的首地址賦給指針變量p,使p指向該字符串字符串在內(nèi)存中是以一維字符數(shù)組的形式存儲的,指向字符串的指針實際上是指向存儲該字符串的字符數(shù)組的首地址,在使用字符指針操作字符串時,注意結(jié)束符‘\0’的應(yīng)用9-112023/2/6字符指針C語言并沒有為字符串提供任何專門的表示法,完全使用字符數(shù)組和字符指針來處理字符指針指向字符類型數(shù)據(jù)的指針Howareyou\010-12pStrstr2023/2/6字符指針Howareyou\010-13pStr“Howareyou”char*pStr;pStr=“Howareyou";字符指針pStr是變量char*pStr=“Howareyou";將保存在常量存儲區(qū)的“Howareyou”的首地址賦值給pStr2023/2/6字符指針Howareyou\010-14pStrstr“Howareyou”charstr[12]=“Howareyou”;pStr=&str[0];charstr[12];str=“Howareyou";數(shù)組名str是地址常量即&str[0]單個元素輸入輸出for(i=0;i<10;i++){ scanf(“%c”,&s[i]);}scanf("%s",s);printf("%s",s);char

s[10];gets(s);puts(s);字符數(shù)組的輸入輸出整體輸入輸出for(i=0;s[i]!='\0';i++){ printf(“%c”,s[i]);}for(i=0;i<10;i++){ printf(“%c”,s[i]);}空格、回車或制表符(Tab)是輸入數(shù)據(jù)的分隔符,遇到這些字符,系統(tǒng)認為字符串輸入結(jié)束。字符串中不允許有空格字符串中可以有空格10-15一般不用字符串長度控制inti;

scanf("%d",&i);

/*假如不用&i,就用i,能達到效果嗎?*/charstr[10];

scanf("%s",str);不能讀入帶空格的字符串,例:輸入Clanguage,則數(shù)組中僅存有Cgets()可以注意數(shù)組越界:當用戶的輸入多于10個(含10個),str數(shù)組將越界scanf()10-16字符串的訪問和輸入/輸出gets()函數(shù)調(diào)用格式:說明:(1)該函數(shù)專用于輸入字符串。(2)函數(shù)參數(shù)只能用數(shù)組名。gets(字符數(shù)組名);(3)gets函數(shù)接收換行符之前所有的字符??梢宰x入帶空格的字符串10-171、用printf函數(shù)加%s控制charstr[]="Thisisabook";printf("%s",str);例:2、用puts函數(shù)調(diào)用格式:其中:參數(shù)可以是字符串變量/字符串常量。puts(參數(shù))字符串的輸出10-18....puts(str);

puts(“forsmartpeople");...

puts()與printf()的不同1、puts()函數(shù)專門用于字符串輸出printf()函數(shù)用于各種類型數(shù)據(jù)輸出2、puts()函數(shù)輸出后自動換行。printf()函數(shù)必須用"\n"強行換行。建議:多種類型的混合輸入輸出時,選用scanf和printf;大量文字信息輸入輸出時,使用gets和puts。10-19字符串輸入函數(shù)gets()也沒有提供限制輸入字符串長度的方法,容易引起緩沖區(qū)溢出,給黑客攻擊以可乘之機對輸入字符串長度有限制的函數(shù)調(diào)用fgets(buf,sizeof(buf),stdin);gets()10-20假若交給這些字符串處理函數(shù)的字符串沒有‘\0'會如何?'\0'很關(guān)鍵,如果沒有,那么這些處理函數(shù)會一直進行處理直到遇到一個'\0'為止。此時可能已經(jīng)把內(nèi)存弄得亂七八糟‘\0’作為字符串結(jié)束符的天生缺陷10-212023/2/6例:輸入一個人名,把它顯示在屏幕上

Why?10-222023/2/6例:輸入一個人名,把它顯示在屏幕上10-232023/2/610-24【例10.2】使用函數(shù)gets(),從鍵盤輸入一個帶有空格的人名,然后把它顯示在屏幕上例:輸入一個人名,把它顯示在屏幕上2023/2/6例:輸入一個人名,把它顯示在屏幕上10-25【例10.2】使用函數(shù)gets(),從鍵盤輸入一個帶有空格的人名,然后把它顯示在屏幕上不限制輸入字符串的長度易引起緩沖區(qū)溢出,給黑客攻擊以可乘之機2023/2/6例:輸入一個人名,把它顯示在屏幕上10-26能夠限制輸入字符串的長度【例10.2】使用函數(shù)gets(),從鍵盤輸入一個帶有空格的人名,然后把它顯示在屏幕上根據(jù)數(shù)組name的大小決定讀入幾個字符2023/2/6例:輸入一個人名,把它顯示在屏幕上10-27【例10.3】從鍵盤輸入一個帶有空格的人名,然后在顯示人名的前面顯示"Hello",Isaidto例:輸入一個人名,把它顯示在屏幕上10-28【例10.3】從鍵盤輸入一個帶有空格的人名,然后在顯示人名的前面顯示"Hello",Isaidto在<string.h>中定義了若干專門的字符串處理函數(shù)1.字符串復制strcpy(字符數(shù)組1,字符串2);2.求字符串長度

strlen(字符串);3.字符串連接

strcat(字符數(shù)組1,字符串2);4.字符串比較

strcmp(字符串1,字符串2);字符串處理函數(shù)10-29以上函數(shù)原型參見課本P416以上四個函數(shù)的用法要記牢!字符串復制

將字符串2復制到字符數(shù)組1中;**必須保證字符數(shù)組1足夠大字符串處理函數(shù)10-30strcpy(字符數(shù)組1,字符串2);字符串復制31#include<string.h>strcpy(目的字符串,源字符串);stringcopy字符串能否用=整體復制?str2=str1;strcpy(str2,str1);注意復制的方向!str2必須足夠大!32#include<string.h>strcpy(目的字符串,源字符串);stringcopy字符串能否用=整體復制?str2=str1;strcpy(str2,str1);想想這個函數(shù)是如何實現(xiàn)字符串復制的?字符串復制2.求字符串長度

返回字符串的實際長度,不包括'\0‘常用在循環(huán)中控制語句中作為字符數(shù)組結(jié)束的標志字符串處理函數(shù)10-33strlen(字符串);計算字符串長度34charstr[10]={"China"};printf("%d",

strlen(str));打印結(jié)果是5、6,還是10?China\0\0\0\0\0不包括\0的實際字符的個數(shù)strlen(字符串);35#include<string.h>len=

strlen(str);for(i=0;i<len;i++){ putchar(str[i]);}putchar('\n');用長度控制字符串輸出計算字符串長度strlen(字符串);3.字符串連接

將字符串2連接到字符數(shù)組1中的字符串后面,結(jié)果存放在字符數(shù)組1中,函數(shù)調(diào)用后返回字符數(shù)組1的首地址;必須保證字符數(shù)組1足夠大字符串處理函數(shù)10-36strcat(字符數(shù)組1,字符串2);字符串連接37#include<string.h>strcat(目的字符串,源字符串);stringcombinationstrcat(str2,str1);str2必須足夠大!Hello\0\0\0\0\0\0\0

China\0HelloChina\0\0str1str2str24.字符串比較

當出現(xiàn)第一對不相等的字符時,就由這兩個字符(ASCII碼)決定所在字符串的大小字符串處理函數(shù)10-38strcmp(str1,str2)函數(shù)的返回值:當str1=str2時返回值0;當str1<str2

時,返回值

負數(shù);當str1>str2時,返回值正數(shù);strcmp(字符串1,字符串2);39字符串比較#include<string.h>strcmp(字符串1,字符串2);stringcomparison字符串能否用>、<、==比較大小?if(str2==str1)if(strcmp(str2,str1)==0)40字符串比較#include<string.h>strcmp(字符串1,字符串2);stringcomparison字符串是如何比較大小的?當出現(xiàn)第一對不相等的字符時,就由這兩個字符決定所在字符串的大小,返回其ASCII碼比較的結(jié)果值comparecomputercompare<computer表示strcmp(str1,str2)<0為真41【例10.4】按奧運會參賽國國名在字典中的順序?qū)ζ淙雸龃涡蜻M行排序42【例10.4】按奧運會參賽國國名在字典中的順序?qū)ζ淙雸龃涡蜻M行排序America\0\0\0..\0England\0\0\0..\0Australia\0..\0Sweden\0\0\0\0..\0Filand\0\0\0\0..\0Name[N][MAX_LEN]Name[0]Name[1]Name[2]Name[3]Name[4]43【例10.4】按奧運會參賽國國名在字典中的順序?qū)ζ淙雸龃涡蜻M行排序4410.5字符串處理函數(shù)字符串常用函數(shù)的用法要記牢!向函數(shù)傳遞字符串向函數(shù)傳遞字符串時,既可使用字符數(shù)組作函數(shù)參數(shù),也可使用字符指針作函數(shù)參數(shù)傳地址調(diào)用45例:字符串拷貝(1)兩種方法:1.用字符數(shù)組實現(xiàn)字符串的拷貝2.字符指針實現(xiàn)字符串的拷貝開始定義兩個字符數(shù)組退出打印輸出目的字符串讀入源字符串調(diào)用字符串拷貝函數(shù)一個用來存放源字符串一個用來存放目的字符串用字符指針與字符數(shù)組作函數(shù)的參數(shù)應(yīng)用舉例9-46例10.5:字符串拷貝(2)#include<stdio.h>voidMyStrcpy(char

dstStr[],char

srcStr[]);main(){

chara[80],b[80];printf(Pleaseenterastring:);gets(a);

MyStrcpy();printf(Thecopyis:);puts(b);}b,a實參幾個?哪幾個?9-47例10.5:字符串拷貝(4)方法1:用字符數(shù)組編程實現(xiàn)

/*函數(shù)功能:字符串拷貝函數(shù)參數(shù):字符型數(shù)組srcStr,存儲源字符串字符型數(shù)組dstStr,存儲目的字符串函數(shù)返回值:無*/voidMyStrcpy(char

dstStr[],char

srcStr[]){

int

i=0;

while

(srcStr[i]!='\0') {

dstStr[i]=srcStr[i]; i++; }

dstStr[i]='\0';}9-48例10.5:字符串拷貝(3)9-49

HelloChina\0

srcStr[i]dstStr[i]Hi=0ei=1li=2li=3oi=4i=5Ci=6hi=7ii=8ni=9ai=10\0srcStr[i]=='\0voidMyStrcpy(chardstStr[],charsrcStr[]){

inti=0;

while(srcStr[i]!='\0') { dstStr[i]=srcStr[i]; i++; } dstStr[i]='\0';}例10.6:字符串拷貝(5)9-50voidMyStrcpy(char*dstStr,char*srcStr){

while(*srcStr!='\0') { *dstStr=*srcStr; srcStr++; dstStr++; } *dstStr='\0';}

HelloChina\0

*srcStr*dstStrHelloChina\0*srcStr=='\0srcStr++srcStrdstStr++dstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStr例10.6:字符串拷貝(7)#include<stdio.h>voidMyStrcpy(char

*dstStr,char

*srcStr);Main(){

chara[80],b[80];printf(Pleaseenterastring:);gets(a);

MyStrcpy();printf(Thecopyis:);puts(b);}b,a9-51方法2:用字符指針編程實現(xiàn)

/*函數(shù)功能:字符串拷貝函數(shù)參數(shù):字符型指針srcStr,指向源字符串字符型指針dstStr,指向目的字符串函數(shù)返回值:無*/例10.6:字符串拷貝(6)void

MyStrcpy(char

*dstStr,char

*srcStr){

while(*srcStr!='\0') { *dstStr=*srcStr;

srcStr++;

dstStr++; } *dstStr='\0';}9-52例10.7:字符串連接(1)字符型數(shù)組srcStr,存儲字符串1字符型數(shù)組dstStr,存儲字符串2

將字符串2放到字符串1后10-53

54返回一個字符串指針例10.7:編寫函數(shù)實現(xiàn)strcat()函數(shù)的功能

55

China

\0srcStr--srcStr

Hello\0ChinasrcStr==‘\0’dstStrdstStr--dstStrdstStrdstStrdstStr\0返回一個字符串指針dstStr

56例10.7:編程實現(xiàn)strcat()的功能返回字符串首地址返回一個字符串指針#include<stdio.h>main(){

charsrcStr[80],dstSrc[80];inti=0,j=0;gets(srcStr);/*讀入兩個字符串*/gets(dstStr);

/*將srcStr數(shù)組下標定位到字符串結(jié)束標志處*/

while(srcStr[i]!=‘\0’){ i++;}

/*將字符串dstStr連接到字符串srcStr后*/

while(dstStr[j]!=‘\0’){srcStr[i]=dstSrc[j];i++;j++;}

srcStr[i]=‘\0’;/*重新定義字符串srcStr的結(jié)束標志*/

puts(srcStr);/*輸出連接后的字符串srcStr*/}10-57數(shù)組實現(xiàn)例10.8:計算實際字符個數(shù)(1)

開始定義一個字符數(shù)組退出打印輸出字符個數(shù)兩種方法用字符數(shù)組實現(xiàn)用字符指針實現(xiàn)讀入字符串調(diào)用計算字符個數(shù)函數(shù)9-58例10.8:計算實際字符個數(shù)

(2)#include<stdio.h>unsignedint

MyStrlen(charstr[]);main(){

chara[80];

unsignedintlen;printf(Pleaseenterastring:);

gets(a);

len=MyStrlen();printf(Thelengthofthestringis:%u\n,len);}a9-59例10.8:計算實際字符個數(shù)(1)

方法1:用字符數(shù)組實現(xiàn)

/*函數(shù)功能:計算字符串的長度函數(shù)參數(shù):字符型數(shù)組str,存儲字符串函數(shù)返回值:字符串的長度*/unsignedint

MyStrlen(charstr[]){

int

i

;

unsignedint

len=0;

for

(i=0;str[i]!='\0';i++) { len++; }

return

len;}9-60例10.9:計算實際字符個數(shù)

(4)-字符指針#include<stdio.h>unsignedint

MyStrlen(

);main(){

chara[80];

unsignedintlen;printf(Pleaseenterastring:);

gets(a);

len=MyStrlen();printf(Thelengthofthestringis:%u\n,len);}achar

*pstr9-61例10.9:計算實際字符個數(shù)(3)方法2:用字符指針實現(xiàn)

/*函數(shù)功能:計算字符串的長度函數(shù)參數(shù):字符型指針變量pStr,指向字符串函數(shù)返回值:字符串長度

*/unsignedint

MySt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論