版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章字符串2回顧一維數(shù)組的定義、初始化一維數(shù)組元素輸入/輸出二維數(shù)組的定義、初始化二維數(shù)組元素的輸入/輸出必須用數(shù)組處理的一些問題3教學(xué)目標(biāo)理解字符串常量理解字符數(shù)組和字符串的異同使用字符串輸入/輸出函數(shù)使用字符串處理函數(shù)理解指針與字符串的關(guān)系使用字符指針數(shù)組使用字符串作為函數(shù)參數(shù)4字符串簡(jiǎn)介chara='W';charb='a';charc='n';chard='g';chare='L';charf='i';如何讓程序存儲(chǔ)我的姓名?WangLicharname[15]={'W','a','n','g','L','i'};用若干個(gè)字符用字符數(shù)組用字符串5字符串常量字符串常量是雙引號(hào)括起的任意字符序列"HelloWorld""WangPing""Pleaseenteryourfullname:""Hello\"UPC\""字符串常量中可以包含轉(zhuǎn)義序列HelloWorld\0字符串結(jié)束符6字符串與字符數(shù)組在C語言中沒有專門的字符串變量,通常用一個(gè)字符數(shù)組來存放一個(gè)字符串字符串一串以'\0'結(jié)尾的字符在C語言中被看作字符串用雙引號(hào)括起的一串字符是字符串常量,C語言自動(dòng)為其添加'\0'終結(jié)符C語言并沒有為字符串提供任何專門的表示法,完全使用字符數(shù)組和字符指針來處理字符數(shù)組每個(gè)元素都是字符類型的數(shù)組,如charname[20];字符數(shù)組和字符串的區(qū)別是:字符串的末尾有一個(gè)空字符'\0'7一維字符數(shù)組的初始化字符串可按如下方式聲明并初始化:1.用字符型數(shù)據(jù)對(duì)數(shù)組進(jìn)行初始化charname[15]={'W','a','n','g','L','i','\0'};2.用字符串常量直接對(duì)數(shù)組初始化
charname[15]="WangLi";charpassword[]="12345678";手工加入一個(gè)空字符系統(tǒng)將自動(dòng)加入一個(gè)空字符省略數(shù)組大小,系統(tǒng)自動(dòng)計(jì)算,大小為后面的字符總數(shù)加1,最后一個(gè)元素存入一個(gè)空字符。8一維字符數(shù)組的初始化
問題:charch[6]="123456";charch[6]="1234567";charch[6]="123";輸出數(shù)組元素的結(jié)果是什么?9一維字符數(shù)組舉例統(tǒng)計(jì)字符串中每個(gè)字符出現(xiàn)的次數(shù)。基本思路:開一個(gè)“統(tǒng)計(jì)數(shù)組”記錄每個(gè)字符出現(xiàn)的次數(shù)。關(guān)鍵:每個(gè)字符與數(shù)組中進(jìn)行計(jì)數(shù)的元素之間的對(duì)應(yīng)關(guān)系。方法:根據(jù)ASCII碼的性質(zhì),將字符作為統(tǒng)計(jì)數(shù)組中元素的下標(biāo)。intcount[128];10一維字符數(shù)組舉例#include<stdio.h>intcount[128];/*統(tǒng)計(jì)數(shù)組,初始化時(shí)全為0*/intmain(){charline[200];intk=0;printf(”\nEnterString:”);gets(line);while(line[k]!=’\0’)/*對(duì)字符進(jìn)行統(tǒng)計(jì)*/count[line[k++]]++;/*將字符作為下標(biāo)*/for(k=0;k<=127;k++)/*輸出統(tǒng)計(jì)結(jié)果不為0的字符*/if(count[k]>0)printf(”%c=%d\t”,k,count[k]);return0;}11一維字符數(shù)組舉例輸入一行字符,將其中的每個(gè)字符從小到大排列后輸出。#include<stdio.h>intmain(){
charstring[100],t;
inti,j,n;
gets(string);
n=strlen(string);
for(i=0;i<n;i++)/*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(string[j]>string[j+1])
{
t=string[j];
string[j]=string[j+1];
string[j+1]=t;
}
puts(string);return0;}12二維字符數(shù)組二維字符數(shù)組的定義和初始化可將二維數(shù)組當(dāng)作一維數(shù)組使用,這個(gè)一維數(shù)組中的每個(gè)元素是個(gè)一維數(shù)組。chara[3][8]={"str1","str2","string3"};charb[][6]={"s1","st2","str3"};
chara[2][3],b[3][5];str1str2\0\0string3\0\0\0\0\0\0\0a[0]a[0][0]a[1]a[2]數(shù)組a初始化后的存儲(chǔ)情況13二維字符數(shù)組二維字符數(shù)組的引用for(i=0;i<2;i++)printf("%s\n",a[i]);/*輸出i行字符串*/for(i=0;i<2;i++)printf("%c\n",a[i][i]);/*輸出i行i列字符*/for(i=0;i<2;i++)printf("%s\n",&a[i][i+1]);/*輸出i行i+1列字符開始的字符串*/chara[2][3],b[3][5];14二維字符數(shù)組舉例例:輸入英文的星期幾,確定對(duì)應(yīng)的數(shù)字。 可以查星期表,若發(fā)現(xiàn)與表中某項(xiàng)相同(英文的星期幾),則輸出該字符串在表中的位置(序號(hào));若查到表尾仍不相同,則輸出錯(cuò)誤信息??梢越⑷缦滦瞧诒恚篠undayMondayTuesdayWednesdayThursdayFridaySaturdaySunday\0Monday\0Tuesday\0Wednesday\0Thursday\0Friday\0Saturday\0012345601234567890123456用二維字符數(shù)組存儲(chǔ)星期表,每行存一個(gè)字符串15二維字符數(shù)組舉例#include<stdio.h>intmain(){inti,k;charid[10];charw_day[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};printf("Enterastring:");scanf("%s",id);for(i=0;i<7;i++){for(k=0;id[k]!='\0';k++){if(w_day[i][k]==id[k])continue;elsebreak;}if(id[k]=='\0')break;} if(i<7)printf("%sis%d\n",id,i); elseprintf("Error!\n");return0;}16字符串的長(zhǎng)度字符串的長(zhǎng)度是字符串中位于結(jié)束標(biāo)識(shí)'\0'之前的所有字符的個(gè)數(shù)#include<stdio.h>intmain(){ charstr[]="abcdefg"; inti,iLength=0;
while(str[iLength]!='\0') iLength++; printf("Lengthofstring:\n"); for(i=0;i<iLength;i++) printf("%c",str[i]); printf("\nis%d\n",iLength);return0;}while(str[++iLength]!='\0')
;abcdefg\0串長(zhǎng)length=7length=0length=1length=217字符串的輸入輸出對(duì)于字符串(字符數(shù)組),在程序中既可以逐個(gè)引用字符串中的單個(gè)字符(數(shù)組元素)也可以一次引用整個(gè)字符串(字符數(shù)組)(與數(shù)值型數(shù)組的區(qū)別)18對(duì)字符數(shù)組逐個(gè)元素輸入/輸出for(i=0;i<10;i++){ s[i]=getchar();}chars[10];for(i=0;s[i]!='\0';i++){
putchar(s[i]);}putchar('\n');19字符串I/0函數(shù)charname[10];scanf("%s",name);printf("%s",name);格式描述串中使用轉(zhuǎn)換字符串"%s"WangLiWang\0使用scanf時(shí),不能輸入空格Wang20字符串示例#include<stdio.h>intmain(void){ chars1[15]; chars2[]={'A','u','d','r','e','y','\0'}; chars3[]="MichaelHolding"; intcnt=0; printf("\n請(qǐng)向數(shù)組中輸入一個(gè)姓名:"); scanf("%s",s1); printf("\n顯示字符串\n"); printf("第一個(gè)字符串是:"); while(s1[cnt]!='\0'){ printf("%c",s1[cnt]); cnt++; } printf("\n第二個(gè)字符串是:"); printf("%s",s2); printf("\n第三個(gè)字符串是:"); printf("%s\n",s3);return0;}21字符串I/0函數(shù)charname[10];gets(name);puts(name);WangLi\0WangLiWangLi從鍵盤上讀入一個(gè)完整的行,存入字符數(shù)組name。并用空字符'\0'取代行尾的換行符'\n'。把字符數(shù)組中的字符串輸出到顯示器。使用gets函數(shù)允許輸入空格22字符串I/0函數(shù)puts函數(shù)完全可以由printf函數(shù)取代。當(dāng)需要按一定格式輸出時(shí),通常使用printf函數(shù)。printf("\n雇員姓名是:");puts(name);printf("\n雇員所屬部門是:");puts(dept);printf("\n雇員姓名是:%s",name);printf("\n雇員所屬部門是:%s\n",dept);使用puts函數(shù)輸出字符串使用printf函數(shù)輸出字符串23字符串示例#include<stdio.h>intmain(void){charline[30];inti,count=0;printf("\n請(qǐng)輸入一行字符:\n");
gets(line);i=0;while(line[i]!='\0'){ if(line[i]=='') count++; i++;}printf("\n其中的空格總數(shù)為
%d\n",count);return0;}Cisaprogramminglanguage在循環(huán)執(zhí)行時(shí),掃描整個(gè)數(shù)組以統(tǒng)計(jì)出空格''的數(shù)量,直到遇到字符'\0'。每次循環(huán)執(zhí)行時(shí),都會(huì)更新計(jì)數(shù)器i和count。其中的空格總數(shù)為424字符串示例#include<stdio.h>intmain(void){ charname[30]; charaddress[30]; puts("請(qǐng)輸入您的姓名:"); gets(name);
fflush(stdin); puts("請(qǐng)輸入您的地址:"); gets(address);
fflush(stdin); printf("\n您的姓名和地址是:\n"); puts(name); puts(address);return0;}25scanf和gets使用注意事項(xiàng)scanf和gets都可以給字符數(shù)組賦值,scanf不能讀入帶空格的字符串,gets可以。但是scanf和gets兩種用法都不安全,當(dāng)用戶輸入的字符個(gè)數(shù)多于字符數(shù)組的維數(shù)時(shí),數(shù)組將產(chǎn)生越界。scanf被公認(rèn)為最易遭到黑客攻擊的函數(shù)之一gets()也沒有提供限制輸入字符串長(zhǎng)度的方法,容易引起緩沖區(qū)溢出,給黑客攻擊以可乘之機(jī)
對(duì)輸入字符串長(zhǎng)度有限制的函數(shù)調(diào)用fgets(buf,sizeof(buf),stdin);26字符串處理函數(shù)與字符串有關(guān)的內(nèi)置函數(shù)在頭文件string.h中定義要使用標(biāo)準(zhǔn)庫(kù)字符串處理函數(shù),程序前應(yīng)該包含:
#include<string.h>string.hstrlenstrcpystrcmpstrcat……27求字符串長(zhǎng)度函數(shù)語法
strlen(s);描述計(jì)算字符串s中字符的個(gè)數(shù),并將字符的個(gè)數(shù)作為函數(shù)的返回值。在計(jì)算字符個(gè)數(shù)時(shí)不計(jì)表示字符串結(jié)束的空字符'\0'。strlen#include<stdio.h>#include<string.h>intmain(void){chararr[]="Beijing";intlen1,len2;
len1=strlen(arr);len2=strlen("Shanghai");printf("\nstring=%slength=%d",arr,len1);printf("\nstring=%slength=%d\n","Shanghai",len2);return0;}string=Beijinglength=7string=Shanghailength=828字符串復(fù)制將字符串str1拷貝到串str2中。根據(jù)字符串中
\0的位置,只對(duì)\0前面的字符進(jìn)行復(fù)制。 #include<stdio.h>intmain(){charstr1[100],str2[100];inti;printf("Enterstring1:");gets(str1);/*輸入字符串str1*/for(i=0;(str2[i]=str1[i])!='\0';i++);/*復(fù)制*/
printf("Outputstring2:%s\n",str2);return0;}ab.........fg\0ab.........fg\0str1str2.........29字符串復(fù)制函數(shù)語法
strcpy(dest,src)描述其中,dest是目標(biāo)字符串,src是源字符串。相當(dāng)于把字符數(shù)組src中的字符串拷貝到字符數(shù)組dest中。結(jié)束標(biāo)志'\0'也一同拷貝。src可以是一個(gè)字符串常量。字符數(shù)組dest應(yīng)足夠大,以保證字符串復(fù)制不越界。strcpy#include<stdio.h>#include<string.h>intmain(void){ charsource[]="Wechangelives"; chartarget[20];
strcpy(target,source); printf("\n源字符串=%s",source); printf("\n目標(biāo)字符串=%s\n",target);return0;}
源字符串=Wechangelives
目標(biāo)字符串=Wechangelives字符串不能直接整體復(fù)制,必須借助strcpy!30字符串比較函數(shù)語法
strcmp(str1,str2)描述 按照ASCII碼順序比較字符串str1和str2的大小,比較的結(jié)果由函數(shù)返回。在兩個(gè)字符串str1和str2相同時(shí)返回0;字符串str1大于字符串str2時(shí)返回一個(gè)正值,否則就返回負(fù)值。strcmp#include<stdio.h>#include<string.h>intmain(void){ charusername[15],pwd[15]; printf("\n請(qǐng)輸入用戶名:"); gets(username); printf("\n請(qǐng)輸入密碼:"); gets(pwd); if((strcmp(username,"John")==0)&&(strcmp(pwd,"123456")==0)) printf("\n您已成功登錄\n"); else printf("\n用戶名和/或密碼無效\n");return0;}
請(qǐng)輸入用戶名:john
請(qǐng)輸入密碼:123456
用戶名和/或密碼無效
請(qǐng)輸入用戶名:John
請(qǐng)輸入密碼:123456
您已成功登錄字符串不能用關(guān)系運(yùn)算符比較大小,必須借助strcmp!"abc"與"abc",相等"abcd"與"abck","abcd"小"abc"與"ab","abc"大31字符串函數(shù)使用示例從鍵盤任意輸入5個(gè)學(xué)生的姓名,編程找出并輸出按字典順序排在最前面的學(xué)生姓名等價(jià)于求最小字符串32字符串函數(shù)使用示例#include<stdio.h>#include<string.h>#defineARRA_SIZE80intmain(){ intn,num; charstr[ARRA_SIZE],min[ARRA_SIZE]; printf("Pleaseenterfivenames:\n"); gets(str);
strcpy(min,str); for(n=1;n<5;n++){ gets(str); if(strcmp(str,min)<0)
strcpy(min,str);
} printf("Theminis%s:",min);return0;}33字符串連接將串str2連接到串str1之后。根據(jù)字符串中
\0的位置進(jìn)行字符串連接。關(guān)鍵:要用str2的第1個(gè)字符覆蓋str1的串結(jié)束標(biāo)記\0。算法:1、查找str1的串結(jié)束標(biāo)記\02、從str1的\0開始,將str2復(fù)制到str1后面。\0xy...zaabcdefg\0bcdefg\0str2str1.........34字符串連接#include<stdio.h>intmain(){
charstr1[100],str2[100];
inti,j;
printf("Enterstring1:");
gets(str1);
printf("Enterstring2:");
gets(str2);
for(i=0;str1[i]!='\0';i++);/*確定\0位置*/
for(j=0;(str1[i]=str2[j])!='\0';i++,j++);
printf("Outputstring1:%s\n",str1);return0;}35字符串連接函數(shù)語法
strcat(dest,src)描述把字符串src中的字符串連接到字符串dest中字符串的后面。本函數(shù)返回值是字符數(shù)組dest的首地址。連接后字符串的總長(zhǎng)度將是字符串src的長(zhǎng)度加上字符串dest的長(zhǎng)度。目標(biāo)字符串dest的大小應(yīng)足夠存儲(chǔ)最終的字符串。strcat#include<stdio.h>#include<string.h>intmain(void){ charsource_string[]="UPC"; chartarget_string[30]="Hello";
strcat(target_string,source_string); printf("\n源字符串=%s",source_string); printf("\n目標(biāo)字符串=%s\n",target_string);return0;}
源字符串=UPC
目標(biāo)字符串=HelloUPC36字符串大寫轉(zhuǎn)小寫函數(shù)#include<stdio.h>#include<string.h>intmain(void){ charstr1[50]; printf("\n請(qǐng)輸入一個(gè)大寫格式的字符串:\n"); gets(str1); printf("\n"); printf("原始字符串為:%s\n",str1); //用strlwr()將字符串轉(zhuǎn)換為小寫格式
printf("轉(zhuǎn)換后的字符串為:%s\n",strlwr(str1));return0;}37字符串反向在字符串中將首尾字符進(jìn)行對(duì)調(diào) intmain
(){
charstr[100],c;inti,j;
printf("Enterstring:");gets(str);
for(i=0;str[i]!=’\0’;i++);
i--;
for(j=0;j<i;i--,j++){c=str[i];str[i]=str[j];str[j]=c;}
printf("Outputstring:%s\n",str);return0;}\0abcdefghijk\0strj=0i=10ak1j9b28cij=0,1,2,3,i=10,9,8,7,/*確定\0的位置*//*i指向\0之前的最后一個(gè)字符*//*向中間逐步交換i和j指向的字符*/算法:當(dāng)j<i時(shí),逐步交換i和j指向的字符38字符串處理函數(shù)#include<stdio.h>#include<string.h>intmain(void){ charmsg[]="FlylikeaBUTTERFLYandStringlikeaBEE"; printf("\n原始字符串為:%s\n",msg); //用strrev()將字符串進(jìn)行左右反轉(zhuǎn)
printf("\n左右反轉(zhuǎn)后的字符串為:%s\n",strrev(msg));return0;}39總結(jié)字符串與字符數(shù)組的區(qū)別是字符串的末尾有一個(gè)空字符'\0'以標(biāo)識(shí)字符串結(jié)束用scanf()語句讀入字符串時(shí)不允許輸入中存在空格gets()和puts()函數(shù)分別用于字符串的輸入和輸出在string.h中定義了很多字符串處理函數(shù)函數(shù),比較常用的有:strcpy()、strcat()、strcmp()和strlen()假如程序里需要一組字符串,一種常用的做法就是用一個(gè)字符指針數(shù)組表示它們字符串可以作為參數(shù),函數(shù)傳遞機(jī)制同數(shù)組作為參數(shù),為引用方式【設(shè)計(jì)型】8.1字符轉(zhuǎn)換描述提取一個(gè)字符串中的所有數(shù)字字符(‘0’...‘9’)將其轉(zhuǎn)換為一個(gè)整數(shù)輸出。輸入一個(gè)以回車符為結(jié)束標(biāo)志的字符串(少于80個(gè)字符)。輸出把字符串中的所有數(shù)字字符(‘0’...‘9’)轉(zhuǎn)換為一個(gè)整數(shù)并輸出。4041#include<stdio.h>intmain(){ inti,n,t; chara[80]; gets(a); i=0; t=0; while((n=a[i])!='\0') { if((n>='0')&&(n<='9'))printf("%c",n); i++; } printf("\n"); return0;}【設(shè)計(jì)型】8.2合并字符串輸入兩個(gè)已經(jīng)按從小到大順序排列好的字符串,編寫一個(gè)合并兩個(gè)字符串的函數(shù),使合并后的字符串,仍然是從小到大排列。輸入:
兩個(gè)已經(jīng)排好順序(升序)的字符串輸出:
一個(gè)合并在一起的有序(升序)的字符串要求:
設(shè)計(jì)一個(gè)效率盡量高的算法,對(duì)每個(gè)字符串只掃描一遍就可以了。
如果采用先進(jìn)行串連接,然后再進(jìn)行排序的算法,則效率太低了。42【設(shè)計(jì)型】8.3刪除重復(fù)字符背景:輸入一個(gè)長(zhǎng)度不超過100的字符串,刪除串中的重復(fù)字符。輸入:輸入要檢查的字符串,長(zhǎng)度不超過100個(gè)字符。例如:abacaeedabcdcd。輸出:刪除重復(fù)字符后的字符串。例如:abced。43背景:輸入一個(gè)長(zhǎng)度不超過100的字符串,刪除串中的重復(fù)字符并排序。輸入:輸入要檢查的字符串,長(zhǎng)度不超過100個(gè)字符。例如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度虛擬現(xiàn)實(shí)設(shè)備研發(fā)與委托生產(chǎn)合同
- 2024年度機(jī)械設(shè)備買賣合同樣本
- 2024年度人力資源外包與招聘服務(wù)協(xié)議
- 2024年度物流園區(qū)建設(shè)與運(yùn)營(yíng)合同
- 2024年員工保密協(xié)議模板
- 2024年度自建房施工合同終止合同
- 2024年工程預(yù)付款資金監(jiān)管協(xié)議
- 2024出版社與作者之間的出版合同
- 2024年度企業(yè)文化建設(shè)合作協(xié)議
- 2024年建筑企業(yè)與監(jiān)理單位服務(wù)協(xié)議
- 中國(guó)女性生理健康白皮書
- 天然氣巡檢記錄表
- 甲苯磺酸瑞馬唑侖臨床應(yīng)用
- 民法典講座-繼承篇
- 外包施工單位入廠安全培訓(xùn)(通用)
- 糖尿病健康知識(shí)宣教課件
- 客戶接觸點(diǎn)管理課件
- Python語言學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫(kù)2023年
- 醫(yī)學(xué)-心臟驟停急救培訓(xùn)-心臟驟停急救教學(xué)課件
- 高中英語-Book 1 Unit 4 Click for a friend教學(xué)課件設(shè)計(jì)
- 年產(chǎn)30萬噸碳酸鈣粉建設(shè)項(xiàng)目可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論