《程序設計基礎》課件第8章_第1頁
《程序設計基礎》課件第8章_第2頁
《程序設計基礎》課件第8章_第3頁
《程序設計基礎》課件第8章_第4頁
《程序設計基礎》課件第8章_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章字符串8.1字符串

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

習題

8.1字符串

8.1.1字符串常量

1.定義

字符串常量是由一對雙引號括起來的字符序列。例如,"China","Howareyou","$abc","123569","string"?等都是合法的字符串常量。

2.說明

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

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

①字符常量由單引號括起來,字符串常量由雙引號括起來;

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

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

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

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

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

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

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

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

1.字符數(shù)組

C語言中沒有專門的字符串變量,通常用一個字符數(shù)組來存放一個字符串。C語言允許用字符串的方式對字符數(shù)組作初始化,即可以用字符數(shù)組存放一個字符串。

例如:

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

可寫為:

charc[]={"Welcome"};

也可以省略花括號,直接寫為:

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

charc[]="Welcome";

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

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

/*源程序8-1*/

#include"stdio.h"

main()

{

charstring[]="WelcometoChina!";

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

}

程序運行結果如下:

2.字符指針

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

/*源程序8-2*/

#include"stdio.h"

main()

{

char*string="WelcometoChina!";

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

}

程序運行結果如下:

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

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

(2)賦值方式的不同。

例如:字符指針的賦值語句:

char*string="Welcome";

它等價于:

char*string;

string="Welcome";

因為可以將字符串的首地址存放在指針變量中。而字符數(shù)組的賦值語句:

charstring[]="Welcome";

它不等價于:

charstring[];

string[]="Welcome";

因為string表示字符數(shù)組的首地址,是常量,不能在賦值號的左端進行修改,不能將字符串的首地址賦值給數(shù)組名。

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

charstring[20];

scanf("%s",string);

以上語句是正確的。

char*p;

scanf("%s",p);

以上語句是錯誤的,因為字符指針沒有指向任何存儲空間,不能輸入字符串。應改成:

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);

}程序運行結果如下:將程序改為

/*源程序8-4*/

#include"stdio.h"

main()

{

charstring[]="WelcometoChina!";

string=string+11;

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

}

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

8.2.1單個字符串的傳遞

函數(shù)的參數(shù)不僅可以是整型、實型、字符型等數(shù)據(jù),還可以是數(shù)組和指針類型。將字符串從一個函數(shù)傳遞到另一個函數(shù),可以用字符數(shù)組名或指向字符串的指針作參數(shù),實際上傳遞的是字符串的起始地址。在被調用的函數(shù)中如果改變了字符串的內(nèi)容,則在主調函數(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';

}程序運行結果如下:8.2.2多個字符串的傳遞

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

類型名*數(shù)組名[數(shù)組長度];

例如:

char*str[3];

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

char(*str)[3];

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

指針數(shù)組的一個典型的應用是用它來指向若干個字符串,使字符串的處理更加方便靈活。同時也可以將指針數(shù)組作為函數(shù)的參數(shù),此時傳遞的將是此指針數(shù)組的起始地址??梢酝ㄟ^此種方法來處理多個字符串。/*源程序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]);

}

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

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

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

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

cmdnameBASICfoxproFORTRANC

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

#include"stdio.h"

main(intargc,char*argv[])

{

inti;

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

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

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

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

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

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

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

#include"stdio.h"

main()

{

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

puts(str);

}程序運行結果如下:

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

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

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

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

#include"stdio.h"

main()

{

charst[20];

printf("inputstring:\n");

gets(st);

puts(st);

}程序運行結果如下:

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

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

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

功能:將字符數(shù)組2中的字符串連接到字符數(shù)組1中字符串的后面,并刪去字符串1原有的串結束標志?'\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);

}程序運行結果如下:

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

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

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

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

#include"stdio.h"

#include"string.h"

main()

{

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

strcpy(st1,st2);

puts(st1);

}程序運行結果如下:

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

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

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

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

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

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

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

本函數(shù)也可用于比較兩個字符串常量,或比較數(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");

}程序運行結果如下:

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

6.測字符串長度函數(shù)strlen

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

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

#include"stdio.h"

#include"string.h"

main()

{

intn;

charstr[40]="Clanguage";

n=strlen(str);

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

}程序運行結果如下:

習題

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

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

刪除后,字符串中的內(nèi)容應當是

****ABCDEFG

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

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

移動后,字符串中的內(nèi)容應當是

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論