版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄭州汽車(chē)工程職業(yè)學(xué)院《軟件測(cè)試》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江大學(xué)《管理研究方法與科研寫(xiě)作》2023-2024學(xué)年第一學(xué)期期末試卷
- 漳州職業(yè)技術(shù)學(xué)院《MATAB應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 升級(jí)硬件設(shè)施推動(dòng)數(shù)據(jù)中心轉(zhuǎn)型
- 保險(xiǎn)創(chuàng)新產(chǎn)品發(fā)布匯報(bào)模板
- 雙十一金融風(fēng)控模板
- 專(zhuān)業(yè)基礎(chǔ)-房地產(chǎn)經(jīng)紀(jì)人《專(zhuān)業(yè)基礎(chǔ)》名師預(yù)測(cè)卷3
- 企業(yè)文化講座
- 農(nóng)學(xué)研究實(shí)戰(zhàn)解讀
- 教師助人為樂(lè)先進(jìn)事跡材料
- 教育部中國(guó)特色學(xué)徒制課題:基于中國(guó)特色學(xué)徒制的新形態(tài)教材建設(shè)與應(yīng)用研究
- 2025年護(hù)理質(zhì)量與安全管理工作計(jì)劃
- (T8聯(lián)考)2025屆高三部分重點(diǎn)中學(xué)12月第一次聯(lián)考評(píng)物理試卷(含答案詳解)
- 工程施工揚(yáng)塵防治教育培訓(xùn)
- 紅薯采購(gòu)合同模板
- 2023年河南省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 2024年安徽省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 山西省太原市重點(diǎn)中學(xué)2025屆物理高一第一學(xué)期期末統(tǒng)考試題含解析
- 充電樁項(xiàng)目運(yùn)營(yíng)方案
- 2024年農(nóng)民職業(yè)農(nóng)業(yè)素質(zhì)技能考試題庫(kù)(附含答案)
- 高考對(duì)聯(lián)題(對(duì)聯(lián)知識(shí)、高考真題及答案、對(duì)應(yīng)練習(xí)題)
評(píng)論
0/150
提交評(píng)論