(九十五)函式與C 風格字串

2021-09-23 22:46:01 字數 4001 閱讀 6969

當傳遞給函式的是c-

風格字串時,和將陣列傳遞給函式類似。

但傳遞c-

風格字串給函式時,首先是**:

char a[10] = "abcdef";

char *b = a;

函式原型:char abc(char* a,int m); //m是字串長度,非必須

這個時候,將字串傳遞給函式的時候,

引數有三種形式:

①abc(a); //這種方式是將字串作為引數

②abc(b); //這種方式是將指向字串的指標作為引數

③abc("abcdef"); //這種方式是將字串常量作為引數

①和②優點,是可以通過指標或字串(此時字串是位址)作為引數,然後直接修改字串內容。

③的優點,是直接傳遞的常量(注意,這個時候傳遞的不是字串a)。

其中①和②是可以修改的,③是不能修改字串的。假如要禁止字串的修改,那麼在函式原型和函式頭加上const

關鍵字,並相應在其他地方加上

const

關鍵字。

字串作為位址時,實際上是字串第乙個字元的記憶體位址。

如**:

#includeusing namespace std;

char abc(char* a); //函式abc,返回值為char型別

int main()

char abc(char* a)

輸出:

hhhhhh

h請按任意鍵繼續. . .

字串和char

陣列的區別:

字串和char

陣列的最大區別是,字串的最後有結束字元(「

\0」,

ascii值為0

),而不以其為結尾的,則是

char

陣列。

假如不寫完,就容易導致有問題,例如:輸出字串的時候,輸出的是燙(貌似燙是因為亂碼)。

用函式返回字串:

用函式返回字串的方法,是將函式製作為指標函式。

例如函式頭:char *abc(int*m,int n);

這個時候,abc

是函式名,

int*m

是實參傳遞的字串位址,

int n

是字串的寬度。如**:

#includeusing namespace std;

char *hanshu(char*m, const int n);

int main()

char *hanshu(char*m, const int n) //char指標函式

輸出:

mab

mmm請按任意鍵繼續. . .

總結:

①函式可以返回位址(像宣告指標那樣)。

②函式不能在返回位址的時候同時返回字串的長度(但可以通過給字串指定位置賦值'\0'字元)

③也可以在new

字串之後,不能忘記字串的結尾是

\0,否則會出問題。

可以這樣,如**:

char *hanshu(char*m, int n)	//char指標函式

函式與字串總結:

①字串的結尾是"\0"

②假如是void 變數名(char*指標, int 字串長度);

傳遞的引數是指標,不能直接通過指標修改字串,只能通過例如:指標名[0]

這樣,逐個修改字元。

如**:

char word[4] = "mab";

hanshu(word);

void hanshu(char*m) //char指標函式

這樣來修改字串。或者使用wihle

或者for

迴圈,迴圈更新使用例如

m++這樣來移動指標。

因為需要逐個修改字元,所以有必要引入字串長度,正如②的第一行那麼寫。在函式內,可以像以上**那樣逐個修改,也可以使用迴圈for

或者while

進行修改。

至於為什麼需要逐個修改字元,不能一次直接修改,不知道……猜測是因為指標型別是char*

,所以不能一次修改。

③假如是有返回值的字串變數,返回值通常為指標位址——非指標位址情況參照(4);

注意,字串應以空字元結尾。

有幾種情況:

(1)在函式內使用

char 變數名

[字串長度

]

由於字串長度要求是常量,即使函式頭傳遞的引數被const

所限定,也是不能使用的,只能直接輸入數字。所以這個辦法——×

(2)在函式內使用

char *指標名 

= new char[

字串長度

]

這種情況下,字串長度可以為函式頭傳遞的引數,並且,不需要一定使用const

進行限定。如函式頭:char *

指標名(

int 變數名

)這樣的。當然,也可以是char *

指標名(

const int 變數名

)這樣的,這個辦法——√

④函式頭:void

開頭——無返回值;

char *開頭,有返回值,返回值為 指標 或 函式內被

static

限定的字串名;

⑤函式頭傳遞的引數:

通常有(1

)int

型別的字串長度;(2)

char*

型別的指標名/字串名等;

需要函式讀取傳遞的引數(如字元,或者指標),來作為新字串的字元的話,在函式頭使用 指標、字串名、或者字元 作為引數。

如:char *

指標名(

char

變數名, int 

字串長度

)

也可以將char 變數名

改為char*指標名

或 char 字串名

等。⑥返回值,有以下幾種情況:

無返回值——函式頭使用void,函式往往是通過傳遞的指標位址來修改字串。

有返回值——函式頭使用char*

字串(

傳遞的引數

),返回值為指標名 或 被static

限定的字串名。通過返回值的位址,來修改字串。

⑦函式本身:

修改原有字串:需要讓指標/字串名作為傳遞的引數,然後逐個修改字串的每個成員。

建立新字串:需要傳遞字串長度(除非預設字串長度為固定值),返回值為指標名(因為函式頭不能為字串名,即

char 

字串名[

字串長度](

傳遞的引數

)——應該吧),因此,函式內部也不能把字串名作為返回值(因為函式執行完後,臨時變數會被刪除,而new

指標指向的位址不會被刪除

)。——但是若用static關鍵字 限定

字串名,則可以用字串名作為新字串的返回值。如**:

#includeusing namespace std;

char *abc(int);

int main()

char *abc(int m)

輸出:

aaa

請按任意鍵繼續. . .

C風格字串與C 風格字串

c風格字串 對字串進行操作的 c 函式定義在標頭檔案中 1.字串定義 char result 2.字串的最後乙個字元是null字元 0 可以通過這個字元確定字串的結尾。3.strlen 返回的是字串的大小 因此,分配空間的時候,需要比字串的實際空間大1.e.g.char copystring con...

C風格字串與C 風格字串

c風格字串 對字串進行操作的 c 函式定義在標頭檔案中 1.字串定義 char result 2.字串的最後乙個字元是null字元 0 可以通過這個字元確定字串的結尾。3.strlen 返回的是字串的大小 因此,分配空間的時候,需要比字串的實際空間大1.e.g.char copystring con...

c風格字串與c風格字串陣列

include includeusing namespace std int main 輸出結果 0034ff10 0034ff10 0034ff04 013bdc80 char str abcd 先在文字常量區為 abcd 常量分配5b,接著在棧裡為指標str分配4b,並接收 abcd 字串的首位...