




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第10章算法和數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)——字符串和文本處理哈爾濱工業(yè)大學(xué)10.1.1字符串的存儲與表示用雙引號括起的一串字符是字符串常量,系統(tǒng)自動為其添加空字符'\0'Howareyou\0用空字符'\0'(ASCII碼值為0)標(biāo)志字符串的末尾——字符串結(jié)束標(biāo)志printf("Howareyou");printf("Howareyou.\n");printf("\"Howareyou.\"\n");Howareyou._"Howareyou."_10.1.1字符串的存儲與表示C語言沒有提供專門的字符串?dāng)?shù)據(jù)類型字符數(shù)組——每個元素都是字符類型的數(shù)組Howareyou\0Howareyou0是字符數(shù)組,但不一定代表字符串?dāng)?shù)組的最后一個元素必須是'\0'才表示字符串不要混淆'\0'(ASCII碼為0)與'0'(ASCII碼為48)字符數(shù)組的定義#defineSTR_LEN80charstr[STR_LEN+1];字符數(shù)組的初始化用字符常量的初始化列表對數(shù)組初始化charstr[6]={'C','h','i','n','a','\0'};用字符串常量直接對數(shù)組初始化
charstr[6]={"China"};charstr[6]="China";charstr[]="China";charstr[10]="China";charstr[4]="China";10.1.1字符串的存儲與表示10.1.1字符串的存儲與表示用一維字符數(shù)組存儲單個字符串charstr[6]={'H','e','l','l','o','\0'};charstr[10]={'H','e','l','l','o'};10.1.1字符串的存儲與表示用二維字符數(shù)組存儲多個字符串charweekday[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};10.1.1字符串的存儲與表示
HelloChina\0pStr"HelloChina";char*pStr=pStr是一個指向常量存儲區(qū)中的字符串的指針變量char*pStr;pStr="HelloChina";可修改pStr的值(指向),但不可以對它所指向的存儲單元進(jìn)行寫操作*pStr=
'W';(1)讓字符指針指向一個字符串常量(2)讓字符指針指向一個字符數(shù)組10.1.1字符串的存儲與表示
HelloChina\0pStr"HelloChina"charstr[]
=
str*pStr='W';char*pStr;pStr=str;pStr=&str[0];pStr的值(指向)可被修改,它所指向的字符串也可被修改str[0]='W';pStr[0]='W';for(i=0;i<10;i++){scanf("%c",&str[i]); //輸入字符數(shù)組}for(i=0;i<10;i++)//不推薦的字符串遍歷方式{printf("%c",str[i]); //輸出字符數(shù)組}#defineSTR_LEN80charstr[STR_LEN+1];10.1.2字符串的輸入和輸出(1)以%c格式,逐個字符輸入/輸出與使用其他類型數(shù)組不同的是,通常不使用長度即計數(shù)控制的循環(huán)來判斷數(shù)組元素是否遍歷結(jié)束,而使用條件控制的循環(huán),利用字符串結(jié)束標(biāo)志'\0'判斷字符串中的字符是否遍歷結(jié)束。scanf("%s",str);printf("%s\n",str);gets(str);puts(str);不能輸入帶空格的字符串可以輸入帶空格的字符串#defineSTR_LEN80charstr[STR_LEN+1];10.1.2字符串的輸入和輸出(2)以%s格式,整體輸入/輸出字符串(3)使用字符串處理函數(shù)gets()和puts()整體輸入/輸出字符串10.1.2字符串的輸入和輸出【例10.1】下面程序用于演示函數(shù)gets()與scanf()的不同。#include<stdio.h>#defineN20intmain(void){charc[N+1]="";printf("Inputastring:\n");scanf("%s",c);printf("Outputastring:\n");printf("%s\n",c);printf("Inputastring:\n");gets(c);printf("Outputastring:\n");puts(c);return0;}10.1.2字符串的輸入和輸出【例10.1】下面程序用于演示函數(shù)gets()與scanf()的不同。#include<stdio.h>#defineN20intmain(void){charc[N+1]="";printf("Inputastring:\n");scanf("%s",c);printf("Outputastring:\n");printf("%s\n",c);getchar();//讀走前面的回車符
printf("Inputastring:\n");gets(c);printf("Outputastring:\n");puts(c);return0;}10.1.2字符串的輸入和輸出(3)使用字符串處理函數(shù)fgets()和fputs()整體輸入/輸出字符串函數(shù)fgets()的原型為:char*fgets(char*buf,intn,FILE*fp);功能是從fp所指的文件中讀取字符串并在字符串末尾添加‘\0’,然后存入s,最多讀n-1個字符??梢韵拗朴脩糨斎氲淖址麛?shù),更安全。fgets()與gets()對回車換行符的處理也是不同的,fgets()從指定的流讀字符串,讀到回車換行符時將回車換行符也作為字符串的一部分讀到字符串中來。函數(shù)fputs()的原型為:intfputs(char*buf,FILE*fp);功能是將buf指向的字符串輸出到fp所指定的文件。10.1.2字符串的輸入和輸出【例10.2】最牛微信。請你編寫程序測試上述計算結(jié)果的正確性。//函數(shù)功能:將字符數(shù)組str中的字符串轉(zhuǎn)換為英文字母對應(yīng)的數(shù)字,然后累加求和并返回intLetterSum(charstr[]){inti,sum=0;for(i=0;str[i]!='\0';i++){if(str[i]>='a'&&str[i]<='z'){sum+=str[i]-'a'+1;}elseif(str[i]>='A'&&str[i]<='Z'){sum+=str[i]-'A'+1;}else{return-1;}}returnsum;}#include<stdio.h>intLetterSum(charstr[]);intmain(void){chara[80];intsum;printf("Inputaword:");gets(a);sum=LetterSum(a);if(sum!=-1){printf("%s=%d%%\n",a,sum);}else{printf("Inputerror!\n");}return0;}10.1.2字符串的輸入和輸出//函數(shù)功能:將字符數(shù)組str中的字符串轉(zhuǎn)換為英文字母對應(yīng)的數(shù)字,然后累加求和并返回intLetterSum(charstr[]){inti,sum=0;for(i=0;str[i]!='\0';i++){
if(islower(str[i])){sum+=str[i]-'a'+1;}
elseif(isupper(str[i])){sum+=str[i]-'A'+1;}else{return-1;}}returnsum;}#include<stdio.h>#include<ctype.h>intLetterSum(charstr[]);intmain(void){chara[80];intsum;printf("Inputaword:");gets(a);sum=LetterSum(a);if(sum!=-1){printf("%s=%d%%\n",a,sum);}else{printf("Inputerror!\n");}return0;}10.1.2字符串的輸入和輸出//函數(shù)功能:將str指向的字符串轉(zhuǎn)換為英文字母對應(yīng)的編號數(shù)字,然后累加求和并返回intLetterSum(char*str){intsum=0;for(;*str!='\0';str++){if(*str>='a'&&*str<='z')
{sum+=*str-'a'+1;}elseif(*str>='A'&&*str<='Z')
{sum+=*str-'A'+1;}else{return-1;}}returnsum;}#include<stdio.h>intLetterSum(char*str);intmain(void){chara[80];intsum;printf("Inputaword:");gets(a);sum=LetterSum(a);if(sum!=-1){printf("%s=%d%%\n",a,sum);}else{printf("Inputerror!\n");}return0;}10.1.2字符串的輸入和輸出10.1.4字符串處理函數(shù)#include<string.h>strcpy(目的字符數(shù)組,源字符串);stringcopystrlen(字符串);stringlengthstrcat(目的字符數(shù)組,源字符串);stringcombinationstrcmp(字符串1,字符串2);stringcomparison#include<string.h>strlen(字符串);charstr[10]={"China"};printf("%d",
strlen(str));問題:輸出結(jié)果是5,6,還是10?
China\0\0\0\0\0不包括'\0'的實際字符的個數(shù)10.1.4字符串處理函數(shù)len=strlen(str);for(i=0;i<len;i++){ putchar(str[i]);}putchar('\n');for(i=0;str[i]!='\0';i++){ putchar(str[i]);}putchar('\n');用計算得到的字符串長度控制字符串輸出用字符串結(jié)束標(biāo)志(空字符)控制字符串輸出#defineSTR_LEN80charstr[STR_LEN+1];10.1.4字符串處理函數(shù)#include<string.h>strcpy(目的字符數(shù)組,源字符串);問題:字符串能否用賦值運(yùn)算符(=)整體復(fù)制?str2=str1;strcpy(str2,str1);注意復(fù)制方向!str2須足夠大!strncpy(str2,str1,n);更安全!strcpy(str2,strcpy(str1,"Hello"));10.1.4字符串處理函數(shù)#include<string.h>strcat(目的字符數(shù)組,源字符串);strcat(str2,str1);str2必須足夠大!Hello\0\0\0\0\0\0\0
China\0HelloChina\0\0strncat(str2,str1,n);strcat(str2,strcat(str1,"Hello"));10.1.4字符串處理函數(shù)#include<string.h>strcmp(字符串1,字符串2);問題:字符串能否用關(guān)系運(yùn)算符>,<,==直接比較大小?if(str2==str1)if(strcmp(str2,str1)==0)if(strncmp(str2,str1,n)==0)10.1.4字符串處理函數(shù)問題:字符串是如何比較大小的?當(dāng)出現(xiàn)第一對不相等的字符時,就由這兩個字符決定所在字符串的大小,返回其ASCII碼比較的結(jié)果值(差值)comparecomputer判斷str1是否小于str2?
if(strcmp(str1,str2)<0)#include<string.h>strcmp(字符串1,字符串2);10.1.4字符串處理函數(shù)10.1.4字符串處理函數(shù)【例10.3】請自己編寫一個字符串比較函數(shù)MyStrcmp(),輸入一個密碼,調(diào)用函數(shù)MyStrcmp()判斷用戶輸入的密碼是否正確,如果正確,則輸出"Welcome!\n",如果不正確,則輸出"Sorry!\n",直到用戶輸入正確為止。#include<stdio.h>intMyStrcmp(constchars[],constchart[]);intmain(void){ charpassword[8]="secret",input[8]; while(1) {
printf("Enteryourpassword:");
gets(input);
if(MyStrcmp(input,password)==0)
{
printf("Welcome!\n");
break;
}
else
{
printf("Sorry!\n");
} } return0;}//函數(shù)功能:采用字符數(shù)組做函數(shù)參數(shù)實現(xiàn)字符串比較intMyStrcmp(constchars[],constchart[]){
inti; for(i=0;s[i]==t[i];i++) {
if(s[i]=='\0')return0; } returns[i]-t[i];}//函數(shù)功能:采用字符指針做函數(shù)參數(shù)實現(xiàn)字符串比較intMyStrcmp(constchar*p1,constchar*p2){ for(;*p1==*p2;p1++,p2++) { if(*p1=='\0')return0; } return*p1-*p2;}香港中文大學(xué)《獨立時代》雜志,2014年“愿付雁書常思君——微情書征文大賽”一等獎作品10.2字符串的應(yīng)用——編程帶你去看“詩和遠(yuǎn)方”10.2.1向函數(shù)傳遞字符串【例10.4】假設(shè)你進(jìn)入了一個科幻世界,在那里科學(xué)家們發(fā)明了一種時光穿梭機(jī),你只要能將字符串逆序過來,你就可以穿越回過去,讓昨日重現(xiàn)、一如往昔?,F(xiàn)在,請你編寫這樣一個字符串逆序程序。#include<stdio.h>#include<string.h>#defineN20voidReverse(constcharstr[],charreverse[]);intmain(void){charinput[N+1],reverse[N+1];gets(input);Reverse(input,reverse);puts(reverse);return0;}//函數(shù)功能:采用字符數(shù)組做函數(shù)參數(shù)實現(xiàn)字符串逆序voidReverse(constcharstr[],charreverse[]){inti;intlen=strlen(str);//計算字符串str的長度
for(i=0;str[i]!='\0';i++){reverse[i]=str[len-i-1];}reverse[i]='\0';}10.2.1向函數(shù)傳遞字符串【例10.4】假設(shè)你進(jìn)入了一個科幻世界,在那里科學(xué)家們發(fā)明了一種時光穿梭機(jī),你只要能將字符串逆序過來,你就可以穿越回過去,讓昨日重現(xiàn)、一如往昔。現(xiàn)在,請你編寫這樣一個字符串逆序程序。#include<stdio.h>#include<string.h>#defineN20voidReverse(charstr[]);intmain(void){charinput[N+1];gets(input);Reverse(input);puts(input);return0;}//函數(shù)功能:采用字符數(shù)組做函數(shù)參數(shù)實現(xiàn)字符串逆序voidReverse(charstr[]){intlen,i,j;chartemp;len=strlen(str);for(i=0,j=len-1;i<j;i++,j--){temp=str[i];str[i]=str[j];str[j]=temp;}}10.2.1向函數(shù)傳遞字符串【例10.4】假設(shè)你進(jìn)入了一個科幻世界,在那里科學(xué)家們發(fā)明了一種時光穿梭機(jī),你只要能將字符串逆序過來,你就可以穿越回過去,讓昨日重現(xiàn)、一如往昔?,F(xiàn)在,請你編寫這樣一個字符串逆序程序。#include<stdio.h>#include<string.h>#defineN20voidReverse(charstr[]);intmain(void){
charinput[N+1];
gets(input);
Reverse(input);
puts(input);
return0;}//函數(shù)功能:采用字符指針做函數(shù)參數(shù)實現(xiàn)字符串逆序voidReverse(char*p){ intlen; chartemp,*pStart,*pEnd; len=strlen(p); for(pStart=p,pEnd=p+len-1;pStart<pEnd;pStart++,pEnd--) { temp=*pStart; *pStart=*pEnd; *pEnd=temp; }}【例10.5】蘇東坡曾寫過一首回文詩《題金山寺》,這首詩順讀,讀者仿佛看到了從月夜泛舟到江天破曉的景致而反過來讀,仿佛是一幅從黎明曉日,到漁舟唱晚的畫卷:輕鷗數(shù)點千峰碧,水接云邊四望遙。晴日晚霞紅靄靄,曉天江樹綠迢迢。清波石眼泉當(dāng)檻,小徑松門寺對橋。明月釣舟漁浦遠(yuǎn),傾山雪浪暗隨潮。潮隨暗浪雪山傾,遠(yuǎn)浦漁舟釣月明。橋?qū)λ麻T松徑小,檻當(dāng)泉眼石波清。迢迢綠樹江天曉,靄靄紅霞晚日晴。遙望四邊云接水,碧峰千點數(shù)鷗輕。10.2.1向函數(shù)傳遞字符串現(xiàn)在,請你編程從鍵盤任意輸入一個字符串,判斷這個字符串是否是回文。如果是回文,則輸出"Yes!",否則輸出"No!"。10.2.1向函數(shù)傳遞字符串#include<stdio.h>#include<string.h>#include<stdbool.h>#defineN80boolIsPlalindrome(constcharstr[]);intmain(void){chara[N];printf("Inputastring:");gets(a);if(IsPlalindrome(a)){printf("Yes\n");}else{printf("No\n");}return0;}//函數(shù)功能:判斷回文字符串boolIsPlalindrome(constcharstr[]){inti,j;for(i=0,j=strlen(str)-1;i<j;i++,j--){if(str[i]!=str[j]){returnfalse;}}returntrue;}10.2.1向函數(shù)傳遞字符串#include<stdio.h>#include<string.h>#include<stdbool.h>#defineN80boolIsPlalindrome(constcharstr[]);voidReverse(constcharstr[],charreverse[]);intmain(void){
chara[N];
printf("Inputastring:");
gets(a);
if(IsPlalindrome(a))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return0;}//函數(shù)功能:判斷回文字符串boolIsPlalindrome(constcharstr[]){charrev[N];Reverse(str,rev);returnstrcmp(str,rev)==0?true:false;}//函數(shù)功能:采用字符數(shù)組做函數(shù)參數(shù)實現(xiàn)字符串逆序voidReverse(constcharstr[],charreverse[]){inti;intlen=strlen(str);//計算字符串str的長度
for(i=0;str[i]!=‘\0’;i++){reverse[i]=str[len-i-1];}reverse[i]='\0';}10.2.1向函數(shù)傳遞字符串#include<stdio.h>#include<string.h>#include<stdbool.h>#defineN80boolIsPlalindrome(constcharstr[]);voidReverse(charstr[]);intmain(void){chara[N];printf("Inputastring:");gets(a);if(IsPlalindrome(a)){printf("Yes\n");}else{printf("No\n");}return0;}//函數(shù)功能:判斷回文字符串boolIsPlalindrome(constcharstr[]){charrev[N];strcpy(rev,str);Reverse(rev);returnstrcmp(str,rev)==0?true:false;}//函數(shù)功能:采用字符數(shù)組做函數(shù)參數(shù)實現(xiàn)字符串逆序voidReverse(charstr[]){intlen,i,j;chartemp;len=strlen(str);for(i=0,j=len-1;i<j;i++,j--){temp=str[i];str[i]=str[j];str[j]=temp;}}請輸入藏頭詩:
一葉輕舟向東流↙
帆梢輕握楊柳手↙
風(fēng)纖碧波微起舞↙
順?biāo)螐难趴陀屁L
一
帆
風(fēng)
順
10.2.2從函數(shù)返回字符串——破解藏頭詩【例10.6】編程破解用戶從鍵盤輸入的一首4句的藏頭詩10.2.2從函數(shù)返回字符串——破解藏頭詩【例10.6】編程破解用戶從鍵盤輸入的一首4句的藏頭詩#include<stdio.h>#defineN20voidGetFirst(chars[][N],chart[]);intmain(void){chars[4][N],t[N];printf("請輸入藏頭詩:\n");for(inti=0;i<4;i++){scanf("%s",s[i]);}
GetFirst(s,t);
puts(t);return0;}voidGetFirst(chars[][N],chart[]){for(inti=0;i<4;i++){t[2*i]=s[i][0];//漢字首字節(jié)t[2*i+1]=s[i][1];//漢字末字節(jié)}t[2*i]='\0';//很重要}10.2.2從函數(shù)返回字符串——破解藏頭詩【例10.6】編程破解用戶從鍵盤輸入的一首4句的藏頭詩#include<stdio.h>#defineN20char*GetFirst(chars[][N],chart[]);intmain(void){chars[4][N],t[N];printf("請輸入藏頭詩:\n");for(inti=0;i<4;i++){scanf("%s",s[i]);}
puts(GetFirst(s,t));return0;}char*GetFirst(chars[][N],chart[]){for(inti=0;i<4;i++){t[2*i]=s[i][0];t[2*i+1]=s[i][1];}t[2*i]='\0';returnt;}10.2.3錯誤實例分析【例10.7】下面的字符串連接程序存在錯誤,請分析錯誤的原因。#include<stdio.h>#include<string.h>char*MyStrcat(char*dest,char*source);intmain(void){ char*first="Hello"; char *second="xWorld"; char *result; result=MyStrcat(first,second); printf("Theresultis:%s\n",result);return0;}//函數(shù)功能:將字符串source連接到字符串dest后char*MyStrcat(char*dest,char*source){ for(inti=0;i<strlen(source)+1;i++) { *(dest+strlen(dest)+i)=*(source+i); } returndest;}10.2.3錯誤實例分析【例10.7】下面的字符串連接程序存在錯誤,請分析錯誤的原因。//函數(shù)功能:將字符串source連接到字符串dest后char*MyStrcat(char*dest,char*source){ for(inti=0;i<strlen(source)+1;i++) { *(dest+strlen(dest)+i)=*(source+i); } returndest;}10.2.3錯誤實例分析【例10.7】下面的字符串連接程序存在錯誤,請分析錯誤的原因。char*MyStrcat(char*dest,char*source){ intdestLen=strlen(dest); for(inti=0;i<strlen(source)+1;i++) { *(dest+destLen+i)=*(source+i); } returndest;}char*MyStrcat(char*dest,char*source){ char*pStr=dest;//保存字符串dest的首地址
while(*dest!='\0') { dest++;
}
for(;*source!='\0';dest++,source++) { *dest=*source; } *dest='\0';
returnpStr;}10.3指針數(shù)組及其應(yīng)用本節(jié)主要討論如下問題:(1)如何理解指針和二維數(shù)組之間的關(guān)系?(2)何為指針數(shù)組?指針數(shù)組和指向數(shù)組的指針有什么不同?(3)字符指針數(shù)組在字符串處理中有什么用?10.3.1指針和二維數(shù)組間的關(guān)系——以撲克牌為例1.二維數(shù)組的行地址和列地址的概念10.3.1指針和二維數(shù)組間的關(guān)系——以撲克牌為例2.二維數(shù)組的列指針的定義和初始化若要讓一個指針指向它,則應(yīng)定義為int*p;//列指針,基類型是int型p=a[0];//*(a+0)+0即&a[0][0],指向第0行第0列的int型元素10.3.2字符指針數(shù)組和二維字符數(shù)組字符指針數(shù)組表示的星期表每個元素都是一個字符串指針,每個指針指向一個常量字符串,節(jié)省存儲空間
char*weekDays[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};printf("%s\n",weekDays[i]);puts(weekDays[i]);10.3.2字符指針數(shù)組和二維字符數(shù)組用數(shù)組作為指針的基類型——指向數(shù)組的指針例如:int(*pStr)[5];用指針作數(shù)組的基類型——指針數(shù)組(PointerArray)元素為指針類型的數(shù)組定義形式為:數(shù)據(jù)類型*數(shù)組名[數(shù)組長度];例如:char*pStr[5];
【例10.8】2021年5月22日10時40分,“祝融號”火星車成功駛離著陸平臺,到達(dá)火星表面,開始巡視探測。從后避障相機(jī)拍攝到的兩道車軸痕,都是人類為邁向宇宙而努力的蹣跚之路,稚嫩、跌跌撞撞卻又生機(jī)勃勃無比堅定的啟程之路。1970年4月24日第一顆人造地球衛(wèi)星“東方紅-1”號的成功發(fā)射是中國航天器發(fā)展史上的第一個里程碑,“神舟-5”號載人宇宙飛船的成功發(fā)射則是第二個里程碑。近年來,中國航天事業(yè)一直受到關(guān)注,除了獨立自主的尖端技術(shù),航天器的名字也很吸人眼球。2004年,探月工程被命名為“嫦娥工程”;2011年,我國第一個目標(biāo)飛行器命名為“天宮一號”;2020年,“北斗三號”全球衛(wèi)星導(dǎo)航系統(tǒng)正式開通,我國首次火星探測任務(wù)正式啟動,任務(wù)命名“天問一號”,出自屈原的《天問》。從神舟到鵲橋,從墨子到祝融,我國航天器的名字不僅充滿詩意,相互之間更有著緊密聯(lián)系,這些標(biāo)志著中國航天人奮斗史的大國重器,被一個個源自中國傳統(tǒng)神話的名字刻下了浪漫的符號,不僅體現(xiàn)著中華民族連綿不斷的文化底蘊(yùn),更見證著中國人一步步實現(xiàn)飛天夢想的光榮歷程。假設(shè)現(xiàn)在有n(1<=n<=10)個航天器,它們的名字均為長度小于等于20的字符串,請按字典序輸出這些它們的名字。10.3.2字符指針數(shù)組和二維字符數(shù)組10.3.2字符指針數(shù)組和二維字符數(shù)組#include<stdio.h>#include<string.h>#defineMAX_LEN20 //字符串最大長度#defineN150 //字符串個數(shù)voidInput(charstr[][MAX_LEN],intn);voidStrSort(charstr[][MAX_LEN],intn);voidOutput(charstr[][MAX_LEN],intn);intmain(void){intn;charname[N][MAX_LEN];//定義二維字符數(shù)組
printf("Howmanystrings?");scanf("%d",&n);getchar();//讀走輸入緩沖區(qū)中的回車符
printf("Inputtheirnames:\n");Input(name,n);StrSort(name,n);//字符串按字典順序排序
printf("Sortedresults:\n");Output(name,n);return0;}10.3.2字符指針數(shù)組和二維字符數(shù)組voidInput(charstr[][MAX_LEN],intn){for(inti=0;i<n;i++){ gets(str[i]);
}}voidOutput(charstr[][MAX_LEN],intn){for(inti=0;i<n;i++){puts(str[i]);
}}//函數(shù)功能:用二維字符數(shù)組做函數(shù)參數(shù),交換法實現(xiàn)字符串按字典順序排序voidStrSort(charstr[][MAX_LEN],intn){chartemp[MAX_LEN];for(inti=0;i<n-1;i++){for(intj=i+1;j<n;j++){if(strcmp(str[j],str[i])<0)
{strcpy(temp,str[i]);strcpy(str[i],str[j]);strcpy(str[j],temp);}}}}10.3.2字符指針數(shù)組和二維字符數(shù)組#include<stdio.h>#include<string.h>#defineMAX_LEN20 //字符串最大長度#defineN150 //字符串個數(shù)voidInput(char*pStr[],intn);voidStrSort(char*pStr[],intn);voidOutput(char*pStr[],intn);intmain(void){intn;charname[N][MAX_LEN];//定義二維字符數(shù)組
char*pStr[N]; //定義字符指針數(shù)組
printf("Howmanystrings?");scanf("%d",&n);getchar();//讀走輸入緩沖區(qū)中的回車符
printf("Inputtheirnames:\n");for(inti=0;i<n;i++){pStr[i]=name[i];//讓pStr[i]指向二維字符數(shù)組name的第i行
}Input(pStr,n);StrSort(pStr,n);//字符串按字典順序排序
printf("Sortedresults:\n");Output(pStr,n);return0;}10.3.2字符指針數(shù)組和二維字符數(shù)組//函數(shù)功能:用字符指針數(shù)組做函數(shù)參數(shù),按交換法實現(xiàn)字符串按字典順序排序voidStrSort(char*pStr[],intn){char*temp=NULL;
for(inti=0;i<n-1;i++){for(intj=i+1;j<n;j++){if(strcmp(pStr[j],pStr[i])<0)
{temp=pStr[i];pStr[i]=pStr[j];pStr[j]=temp;}}}}voidInput(char*pStr[],intn){for(inti=0;i<n;i++){ gets(pStr[i]);
}}voidOutput(char*pStr[],intn){for(inti=0;i<n;i++){puts(pStr[i]);
}}10.3.3錯誤案例分析【例10.9】從鍵盤輸入m個學(xué)生n門課程的成績,計算每個學(xué)生各門課的總分sum和平均分aver。下面程序有錯誤,請排查錯誤的原因。#include<stdio.h>#defineSTUD30 //最多可能的學(xué)生人數(shù)#defineCOURSE5 //最多可能的考試科目數(shù)voidTotal(int*score,intsum[],floataver[],intm,intn);voidPrint(int*score,intsum[],floataver[],intm,intn);intmain(void){inti,j,m,n,score[STUD][COURSE],sum[STUD];floataver[STUD];printf("Enterthetotalnumberofstudentsandcourses:");scanf("%d%d",&m,&n);printf("Enterscore\n");for(i=0;i<m;i++){ for(j=0;j<n;j++) { scanf("%d",&score[i][j]); }}Total(&score[0][0],sum,aver,m,n);//或用score[0],*score,不能用scorePrint(&score[0][0],sum,aver,m,n);//或用score[0],*score,不能用scorereturn0;}10.3.3錯誤案例分析voidTotal(int*pscore,intsum[],floataver[],intm,intn){inti,j;for(i=0;i<m;i++)//遍歷m個學(xué)生{ sum[i]=0; for(j=0;j<n;j++)//遍歷n門課程 { sum[i]+=*(pscore+i*n+j);//累計第i個學(xué)生的j門課成績 } aver[i]=(float)sum[i]/n;//第i個學(xué)生的n門課程平均分}}voidPrint(int*pscore,intsum[],floataver[],intm,intn){inti,j;printf("Result:\n");for(i=0;i<m;i++){ for(j=0;j<n;j++) { printf("%4d\t",
*(pscore+i*n+j)); } printf("%5d\t%6.1f\n",sum[i],aver[i]);}}10.3.3錯誤案例分析從鍵盤輸入m個學(xué)生n門課程的成績,計算每個學(xué)生各門課的總分sum和平均分aver。voidTotal(int*pscore,intsum[],floataver[],intm,intn){inti,j;for(i=0;i<m;i++)//遍歷m個學(xué)生{ sum[i]=0; for(j=0;j<n;j++)//遍歷n門課程
{ sum[i]+=*(pscore+i*COURSE+j);//累計第i個學(xué)生的j門課成績 } aver[i]=(float)sum[i]/n;//第i個學(xué)生的n門課程平均分}}voidPrint(int*pscore,intsum[],floataver[],intm,intn){inti,j;printf("Result:\n");for(i=0;i<m;i++){ for(j=0;j<n;j++) { printf("%4d\t",
*(pscore+i*COURSE+j)); } printf("%5d\t%6.1f\n",sum[i],aver[i]);}}10.4文本文件的讀寫及應(yīng)用本節(jié)主要討論如下問題:(1)如何讀寫文件中的字符和字符串?(2)如何檢查到達(dá)了文件末尾?(3)gets()與fgets()有何不同?10.4.1讀寫文件中的字符intputchar(intc);向標(biāo)準(zhǔn)輸出流stdout(默認(rèn)屏幕)寫一個字符intgetchar(void);從標(biāo)準(zhǔn)輸入流stdin(默認(rèn)鍵盤)讀入一個字符intputc(intc,FILE*fp);intfputc(intc,FILE*fp);向任意流fp寫一個字符intgetc(FILE*fp);intfgetc(FILE*fp);從任意流fp讀入一個字符fputc(c,stdout)相當(dāng)于putchar(c)fgetc(stdin)相當(dāng)于
getchar()#defineputchar(c)putc(c,stdout)#define
getchar(c)getc(stdin)EOF在stdio.h中定義為-110.4.1讀寫文件中的字符按字符讀寫int
fgetc(FILE*fp);從fp讀出一個字符,將位置指針指向下一個字符若讀成功,則返回該字符若讀到文件尾或者讀取錯誤,則返回EOFint
fputc(intc,FILE*fp);向fp輸出字符c若寫入錯誤,則返回EOF,否則返回c10.4.1讀寫文件中的字符【例10.10】假設(shè)一個名為file.txt的本文文件的內(nèi)容(注意句子后面沒有換行符)如下:yestedayon
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動合同范本 工傷
- 代理鉆床銷售企業(yè)合同范本
- 京東商城合同范本
- 人事中介合同范本
- 保險合作合同范本
- 前公司勞務(wù)合同范本
- 募資合同范本
- 2024年普洱市瀾滄縣縣第二人民醫(yī)院招聘考試真題
- 2024年宿遷市人大常委會辦公室招聘筆試真題
- 2024年欽州市第二人民醫(yī)院信息工程師招聘筆試真題
- 2025年蒙鹽集團(tuán)招聘筆試參考題庫含答案解析
- 精神科醫(yī)療質(zhì)控課件
- 護(hù)理三基三嚴(yán)習(xí)題+參考答案
- 椎間孔鏡的手術(shù)配合
- 四大名著之紅樓夢飲食文化
- 員工互評表(含指標(biāo))
- 美國電話區(qū)號一覽表
- 【MOOC】英語口語進(jìn)階-南京大學(xué) 中國大學(xué)慕課MOOC答案
- 時間規(guī)劃局中文版
- 2024-2030年中國干細(xì)胞美容產(chǎn)業(yè)競爭格局及投資戰(zhàn)略研究報告
- 《霉菌的形態(tài)和結(jié)構(gòu)》課件
評論
0/150
提交評論