《程序設(shè)計(jì)基礎(chǔ)》課件第8章_第1頁(yè)
《程序設(shè)計(jì)基礎(chǔ)》課件第8章_第2頁(yè)
《程序設(shè)計(jì)基礎(chǔ)》課件第8章_第3頁(yè)
《程序設(shè)計(jì)基礎(chǔ)》課件第8章_第4頁(yè)
《程序設(shè)計(jì)基礎(chǔ)》課件第8章_第5頁(yè)
已閱讀5頁(yè),還剩52頁(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)介

第8章字符串8.1字符串

8.2函數(shù)間字符串的傳遞

習(xí)題

8.1字符串

8.1.1字符串常量

1.定義

字符串常量是由一對(duì)雙引號(hào)括起來(lái)的字符序列。例如,"China","Howareyou","$abc","123569","string"?等都是合法的字符串常量。

2.說(shuō)明

(1)雙引號(hào)僅僅起到字符串常量的邊界符作用,并不是字符串常量的一部分。

(2)注意區(qū)分字符串常量和字符常量的區(qū)別。例如,"c"?和?'c'?是根本不同的數(shù)據(jù),前者是字符串常量,后者是字符常量。它們之間主要有以下區(qū)別:

①字符常量由單引號(hào)括起來(lái),字符串常量由雙引號(hào)括起來(lái);

②字符常量只能是單個(gè)字符,字符串常量則可以含一個(gè)或多個(gè)字符;

③可以把一個(gè)字符常量賦予一個(gè)字符變量,但不能把一個(gè)字符串常量賦予一個(gè)字符變量;

④字符常量占一個(gè)字節(jié)的內(nèi)存空間。8.1.2字符串的存儲(chǔ)

C語(yǔ)言規(guī)定:在每一個(gè)字符串的結(jié)尾加一個(gè)“字符串結(jié)束標(biāo)志”,以便系統(tǒng)據(jù)此判斷字符串是否結(jié)束。同時(shí)C語(yǔ)言也規(guī)定:以字符?'\0'?作為字符串的結(jié)束標(biāo)志。字符?'\0'?是一個(gè)ASCII碼為0的字符。從ASCII代碼表中可以看到,ASCII碼為0的字符是“空操作字符”,它不引起任何控制動(dòng)作,也不是一個(gè)可顯示的字符,即它什么也不做。用它作為字符串結(jié)束標(biāo)志不會(huì)產(chǎn)生附加的操作或增加有效字符,它只是一個(gè)供辨別的標(biāo)志。

因此,字符串常量在內(nèi)存中所占的字節(jié)數(shù)等于字符串中有效字符所占的字節(jié)數(shù)(即有效字符的個(gè)數(shù))再加1個(gè)字節(jié)。增加的一個(gè)字節(jié)存放的是字符串結(jié)束的標(biāo)志'\0'。例如:字符串?"Welcome"?在內(nèi)存中所占的字節(jié)為:

注意區(qū)分字符串常量和字符常量的區(qū)別。例如?"s"?和?'s'?,字符串常量?"s"?和字符常量?'s'雖然都只有一個(gè)字符,但在內(nèi)存中的情況是不同的。字符串?"s"?在內(nèi)存中占2個(gè)字節(jié),可表示為:

字符?'s'?在內(nèi)存中占一個(gè)字節(jié),可表示為:

注意:在寫(xiě)字符串時(shí)不必加?'\0'?,'\0'?字符是系統(tǒng)自動(dòng)加上的。8.1.3字符串的表示

1.字符數(shù)組

C語(yǔ)言中沒(méi)有專(zhuān)門(mén)的字符串變量,通常用一個(gè)字符數(shù)組來(lái)存放一個(gè)字符串。C語(yǔ)言允許用字符串的方式對(duì)字符數(shù)組作初始化,即可以用字符數(shù)組存放一個(gè)字符串。

例如:

charc[]={'W','e','l','c','o','m','e'};

可寫(xiě)為:

charc[]={"Welcome"};

也可以省略花括號(hào),直接寫(xiě)為:

charc[]="Welcome";注意:用字符串方式賦值比用字符逐個(gè)賦值要多占一個(gè)字節(jié),多占的字節(jié)用于存放字符串結(jié)束標(biāo)志?'\0'。因此,以下兩個(gè)字符數(shù)組的初始化等價(jià),其字符數(shù)組的長(zhǎng)度都是8。

charc[]="Welcome";

charc[]={'W','e','l','c','o','m','e','\0'};

字符數(shù)組完整的應(yīng)用程序舉例如下:

/*源程序8-1*/

#include"stdio.h"

main()

{

charstring[]="WelcometoChina!";

printf("%s\n",string);

}

程序運(yùn)行結(jié)果如下:

2.字符指針

也可以不定義字符數(shù)組,而定義一個(gè)字符指針,用字符指針指向字符串中第一個(gè)字符的地址。

/*源程序8-2*/

#include"stdio.h"

main()

{

char*string="WelcometoChina!";

printf("%s\n",string);

}

程序運(yùn)行結(jié)果如下:

3.字符數(shù)組和字符指針變量的區(qū)別

(1)字符數(shù)組有若干個(gè)元素,每個(gè)元素中存放一個(gè)字符;而字符指針變量中存放的是字符串中第一個(gè)字符的地址。

(2)賦值方式的不同。

例如:字符指針的賦值語(yǔ)句:

char*string="Welcome";

它等價(jià)于:

char*string;

string="Welcome";

因?yàn)榭梢詫⒆址氖椎刂反娣旁谥羔樧兞恐小6址麛?shù)組的賦值語(yǔ)句:

charstring[]="Welcome";

它不等價(jià)于:

charstring[];

string[]="Welcome";

因?yàn)閟tring表示字符數(shù)組的首地址,是常量,不能在賦值號(hào)的左端進(jìn)行修改,不能將字符串的首地址賦值給數(shù)組名。

(3)字符數(shù)組在編譯時(shí)為其分配存儲(chǔ)單元,有確定的地址;字符指針?lè)峙涞膬?nèi)存單元只能存放一個(gè)字符變量的地址,若沒(méi)有賦值,則沒(méi)有確定的指向。

charstring[20];

scanf("%s",string);

以上語(yǔ)句是正確的。

char*p;

scanf("%s",p);

以上語(yǔ)句是錯(cuò)誤的,因?yàn)樽址羔槢](méi)有指向任何存儲(chǔ)空間,不能輸入字符串。應(yīng)改成:

charstring[20],*p;

p=string;

scanf("%s",p);

(4)指針變量的值可以改變,是變量;數(shù)組名是常量,它的值是不能改變的。

/*源程序8-3*/

#include"stdio.h"

main()

{

char*string="WelcometoChina!";

string=string+11;

printf("%s\n",string);

}程序運(yùn)行結(jié)果如下:將程序改為

/*源程序8-4*/

#include"stdio.h"

main()

{

charstring[]="WelcometoChina!";

string=string+11;

printf("%s\n",string);

}

以上程序是錯(cuò)誤的,原因在于數(shù)組名是常量,它的值是不能改變的。 8.2函數(shù)間字符串的傳遞

8.2.1單個(gè)字符串的傳遞

函數(shù)的參數(shù)不僅可以是整型、實(shí)型、字符型等數(shù)據(jù),還可以是數(shù)組和指針類(lèi)型。將字符串從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù),可以用字符數(shù)組名或指向字符串的指針作參數(shù),實(shí)際上傳遞的是字符串的起始地址。在被調(diào)用的函數(shù)中如果改變了字符串的內(nèi)容,則在主調(diào)函數(shù)中可以得到改變了的字符串。/*源程序8-5*/

#include"stdio.h"

main()

{

voidcopy_str(char*from,char*to);//函數(shù)的聲明

chara[50]="Iamateacher.";

char*b="WelcometoChina!";

printf("a=%s\nb=%s\n",a,b);

copy_str(b,a);

printf("a=%s\nb=%s\n",a,b);}

voidcopy_str(char*from,char*to)

{

inti=0;

while(from[i]!='\0')

{

*(to+i)=from[i];

i++;

}

to[i]='\0';

}程序運(yùn)行結(jié)果如下:8.2.2多個(gè)字符串的傳遞

在一個(gè)數(shù)組中,如果每個(gè)元素都是指針類(lèi)型數(shù)據(jù),則稱(chēng)該數(shù)組為指針數(shù)組。也就是說(shuō),指針數(shù)組中的每一個(gè)元素都相當(dāng)于一個(gè)指針變量。指針數(shù)組的一般定義形式為:

類(lèi)型名*數(shù)組名[數(shù)組長(zhǎng)度];

例如:

char*str[3];

表示str是一個(gè)指針數(shù)組,該數(shù)組有3個(gè)元素,每個(gè)元素值都是一個(gè)指針變量,指向字符型變量。應(yīng)特別注意指針數(shù)組和指向一維數(shù)組的指針變量的區(qū)別。例如:

char(*str)[3];

表示str是一個(gè)指向一維數(shù)組的指針變量,該一維數(shù)組的長(zhǎng)度為3,數(shù)組的元素類(lèi)型為字符型。

指針數(shù)組的一個(gè)典型的應(yīng)用是用它來(lái)指向若干個(gè)字符串,使字符串的處理更加方便靈活。同時(shí)也可以將指針數(shù)組作為函數(shù)的參數(shù),此時(shí)傳遞的將是此指針數(shù)組的起始地址。可以通過(guò)此種方法來(lái)處理多個(gè)字符串。/*源程序8-6*/

#include"stdio.h"

main()

{

voidprint(char*string[],intn);//函數(shù)的聲明

char*str[3];

str[0]="WelcometoChina!";

str[1]="Followme";

str[2]="Iamateacher.";

print(str,3);

}

voidprint(char*string[],intn)

{

inti;

for(i=0;i<n;i++)

printf("%s\n",string[i]);

}

程序運(yùn)行結(jié)果如下:8.2.3main函數(shù)的參數(shù)

指針數(shù)組的一個(gè)重要應(yīng)用是作為main函數(shù)的形參。實(shí)際上,main函數(shù)可以有參數(shù),這個(gè)參數(shù)可以認(rèn)為是main函數(shù)的形式參數(shù)。C語(yǔ)言規(guī)定main函數(shù)的參數(shù)只能有兩個(gè),習(xí)慣上將這兩個(gè)參數(shù)寫(xiě)為argc和argv。因此,帶參數(shù)的main函數(shù)頭可寫(xiě)為:

main(intargc,char*argv[])C語(yǔ)言規(guī)定:main函數(shù)的第一個(gè)形參argc必須是整型變量,main函數(shù)的第二個(gè)形參argv必須是指向字符串的指針數(shù)組。由于main函數(shù)不能被其他函數(shù)調(diào)用,因此不可能在程序內(nèi)部取得實(shí)際值。那么,在什么時(shí)候、在何處把實(shí)參值賦予main函數(shù)的形參呢?實(shí)際上,main函數(shù)的參數(shù)值是從操作系統(tǒng)命令行中獲得的。也就是在一個(gè)命令行中包括命令名和需要傳給main函數(shù)的參數(shù)。命令行的一般形式為:

可執(zhí)行文件名參數(shù)1參數(shù)2…參數(shù)n其中可執(zhí)行文件名(即命令名)和各參數(shù)之間用空格分隔。應(yīng)該特別注意的是main函數(shù)的兩個(gè)形參和命令行中的參數(shù)在位置上的對(duì)應(yīng)關(guān)系。因?yàn)閙ain的形參只有兩個(gè),而命令行中的參數(shù)個(gè)數(shù)原則上未加限制。第一個(gè)形參argc表示了命令行中參數(shù)的個(gè)數(shù)(注意:可執(zhí)行文件名本身也算一個(gè)參數(shù)),argc的值是在輸入命令行時(shí)由系統(tǒng)按實(shí)際參數(shù)的個(gè)數(shù)自動(dòng)賦予的;第二個(gè)形參argv是字符串指針數(shù)組,其各元素值為命令行中各字符串(參數(shù)均按字符串處理)的首地址。指針數(shù)組的長(zhǎng)度即為參數(shù)個(gè)數(shù)。數(shù)組元素初值由系統(tǒng)自動(dòng)賦予。例如有如下命令行:

cmdnameBASICfoxproFORTRANC

在此命令行中,cmdname為可執(zhí)行文件名,BASIC、foxpro、FORTRAN和C為參數(shù)。則對(duì)應(yīng)于此命令行的main函數(shù)的形參argc為5,形參argv的對(duì)應(yīng)關(guān)系如圖8-1所示。圖8-1argv的對(duì)應(yīng)關(guān)系/*源程序8-7*/

#include"stdio.h"

main(intargc,char*argv[])

{

inti;

for(i=0;i<argc;i++)

printf("%s\n",argv[i]);

}假設(shè)此程序保存在D:\,文件名為m.c;經(jīng)過(guò)編譯、連接之后將會(huì)得到可執(zhí)行文件m.exe。則該程序的執(zhí)行過(guò)程和運(yùn)行結(jié)果如下:8.2.4字符串處理函數(shù)

C語(yǔ)言提供了大量的字符串處理函數(shù),使用這些字符串處理函數(shù)可簡(jiǎn)化編程。在使用輸入/輸出的字符串函數(shù)時(shí),應(yīng)包含頭文件?"stdio.h";在使用其他字符串處理函數(shù)時(shí),應(yīng)包含頭文件?"string.h"。以下介紹幾種最常用的字符串函數(shù)。

1.字符串輸出函數(shù)puts

格式:puts(字符數(shù)組)

功能:將字符數(shù)組中的字符串(以?'\0'?作為結(jié)束標(biāo)志)輸出到終端,即在屏幕上顯示該字符串。/*源程序8-8*/

#include"stdio.h"

main()

{

charstr[]="BASIC\ndBASE\nC";

puts(str);

}程序運(yùn)行結(jié)果如下:

從程序中可以看出,puts函數(shù)中可以使用轉(zhuǎn)義字符,因此輸出結(jié)果成為兩行。puts函數(shù)完全可以由printf函數(shù)取代。當(dāng)需要按一定格式輸出時(shí),通常使用printf函數(shù)。

2.字符串輸入函數(shù)gets

格式:gets(字符數(shù)組)

功能:從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))上輸入一個(gè)字符串到字符數(shù)組,并得到一個(gè)函數(shù)值,函數(shù)值為該字符數(shù)組的首地址。/*源程序8-9*/

#include"stdio.h"

main()

{

charst[20];

printf("inputstring:\n");

gets(st);

puts(st);

}程序運(yùn)行結(jié)果如下:

注意:當(dāng)輸入的字符串中含有空格時(shí),輸出仍為全部字符串。gets函數(shù)并不以空格作為字符串輸入結(jié)束的標(biāo)志,而只以回車(chē)作為輸入結(jié)束的標(biāo)志。這與scanf函數(shù)是不同的。

3.字符串連接函數(shù)strcat

格式:strcat(字符數(shù)組1,字符數(shù)組2)

功能:將字符數(shù)組2中的字符串連接到字符數(shù)組1中字符串的后面,并刪去字符串1原有的串結(jié)束標(biāo)志?'\0'。本函數(shù)的返回值是字符數(shù)組1的首地址。/*源程序8-10*/

#include"stdio.h"

#include"string.h"

main()

{

charst1[40]="Yournameis";

charst2[20];

printf("inputyourname:\n");

gets(st2);

strcat(st1,st2);

puts(st1);

}程序運(yùn)行結(jié)果如下:

本程序把初始化賦值的字符數(shù)組與動(dòng)態(tài)賦值的字符串連接起來(lái)。需要特別注意的是,字符數(shù)組1應(yīng)定義有足夠的長(zhǎng)度,否則不能全部裝入被連接的字符串。

4.字符串拷貝函數(shù)strcpy

格式:strcpy(字符數(shù)組1,字符串2)

功能:把字符串2中的字符拷貝到字符數(shù)組1中,字符串2中的結(jié)束標(biāo)志?'\0'?也一同拷貝到字符數(shù)組1中。字符串2也可以是一個(gè)字符串常量,這時(shí)相當(dāng)于把一個(gè)字符串賦予一個(gè)字符數(shù)組。/*源程序8-11*/

#include"stdio.h"

#include"string.h"

main()

{

charst1[30],st2[]="Cpromgram";

strcpy(st1,st2);

puts(st1);

}程序運(yùn)行結(jié)果如下:

本函數(shù)要求字符數(shù)組1應(yīng)有足夠的長(zhǎng)度,否則不能全部裝入所拷貝的字符串。

5.字符串比較函數(shù)strcmp

格式:strcmp(字符串1,字符串2)

功能:對(duì)于這兩個(gè)字符串,從左至右逐個(gè)字符進(jìn)行比較,字符的比較按照所對(duì)應(yīng)ASCII碼的大小進(jìn)行,直到出現(xiàn)不同的字符或遇到'\0'為止。本函數(shù)的返回值是最終比較的結(jié)果,即:

(1)若字符串1等于字符串2,則返回值為0;

(2)若字符串1大于字符串2,則返回值為正整數(shù);

(3)若字符串1小于字符串2,則返回值為負(fù)整數(shù)。

本函數(shù)也可用于比較兩個(gè)字符串常量,或比較數(shù)組和字符串常量。/*源程序8-12*/

#include"stdio.h"

#include"string.h"

main()

{

intk;

charst1[20],st2[]="WelcometoChina!";

printf("inputastring:\n");

gets(st1);k=strcmp(st1,st2);

if(k==0)

printf("st1=st2\n");

if(k>0)

printf("st1>st2\n");

if(k<0)

printf("st1<st2\n");

}程序運(yùn)行結(jié)果如下:

本程序把輸入的字符串和數(shù)組st2中的串比較,比較結(jié)果返回到k中,根據(jù)k的值輸出比較的結(jié)果。當(dāng)輸入字符串為?"Welcometoxi’an"?時(shí),由ASCII碼可知“Welcometoxi’an”大于“WelcometoChina!”,故k>0,輸出結(jié)果為“st1>st2”。

6.測(cè)字符串長(zhǎng)度函數(shù)strlen

格式:strlen(字符數(shù)組)

功能:測(cè)試字符串中有效字符的個(gè)數(shù)(不含字符串結(jié)束標(biāo)志?'\0'?),并將其作為函數(shù)返回值。/*源程序8-13*/

#include"stdio.h"

#include"string.h"

main()

{

intn;

charstr[40]="Clanguage";

n=strlen(str);

printf("Thelengthofthestringis%d\n",n);

}程序運(yùn)行結(jié)果如下:

習(xí)題

1.編寫(xiě)函數(shù)fun,其首部為voidfun(char*s)。它的功能是:將s所指字符串中所有下標(biāo)為奇數(shù)位置上的字母轉(zhuǎn)換為大寫(xiě)(若該位置上不是字母,則不轉(zhuǎn)換)。例如,若輸入"abc4EFg",則應(yīng)輸出"aBc4EFg"。

2.假定輸入的字符串中只包含字母和“*”號(hào)。編寫(xiě)函數(shù)fun,其首部為voidfun(char*s)。它的功能是:除了字符串前導(dǎo)的*號(hào)之外,將字符串中其他*號(hào)全部刪除。在編寫(xiě)函數(shù)時(shí),最好不使用C語(yǔ)言提供的字符串函數(shù)。例如,字符串中的內(nèi)容為****A*BC*DEF*G*******

刪除后,字符串中的內(nèi)容應(yīng)當(dāng)是

****ABCDEFG

3.假定輸入的字符串中只包含字母和*號(hào)。編寫(xiě)函數(shù)fun,其首部為voidfun(char*s)。它的功能是:將字符串中的前導(dǎo)*號(hào)全部移到字符串的尾部。例如,字符串中的內(nèi)容為

*******A*BC*DEF*G****

移動(dòng)后,字符串中的內(nèi)容應(yīng)當(dāng)是

A*BC*DEF*G***********

在編寫(xiě)函數(shù)時(shí),最好不使用C語(yǔ)言提供的字符串函數(shù)。

4.假定輸入的字符串中只包含字母和*號(hào)。編寫(xiě)函數(shù)fun,其首部為voidfun(char*s)。它的功能是:使字符串的前導(dǎo)*號(hào)不得多于n個(gè);若多于n個(gè),則刪除多余的*號(hào);若少于或等于n個(gè),則什么也不做;字符串中間和尾部的*號(hào)不刪除。例如,字符串中的內(nèi)容為

*******A*BC*DEF*G****

若n的值為4,則刪除后,則字符串中的內(nèi)容應(yīng)當(dāng)是

****A*BC*DEF*G****

若n的值為8,則字符串中的內(nèi)容仍為

*******A*BC*DEF*G

溫馨提示

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