返回字串函式的方法總結

2021-08-14 06:15:34 字數 3421 閱讀 5038

emm,,c語言字串和指標兩大精華,得之得c天下。

其實有乙個問題,原來一直困擾著自己,只是自己總是選擇忽略,今天又暴露了出來,必須得去解決一下了。

另外關於字串的另一些博文:

1、字元陣列和字元指標的比較學習

2、字串那些事。

q:如何在乙個函式返回字元陣列(或者字串)呢?

下面給出四種返回字串的方法:

1、 將字串指標作為函式引數傳入,並返回該指標。

2、 使用malloc函式動態分配記憶體,注意在主調函式中釋放。

3、 返回乙個靜態區域性變數。

4、 使用全域性變數。

當然各有利弊,就拿乙個例子來具體學習下吧。

#include 

#include

char* mystring()

int main()

cb編譯後 。。。

warning: function returns address of local variable [-wreturn-local-addr]|

意即返回區域性變數的位址,而我們知道區域性變數當函式呼叫完畢後就釋放了。你也就根本不知道這個記憶體會是什麼了。

怎麼辦呢?

很容易想到的,我把它直接定義成static,不就相當於全域性變數了嘛!這樣這塊記憶體位址就不會隨著函式呼叫完畢而消滅了。

#include 

#include

char* mystring()

int main()

注意:

需要注意,不要修改返回的這個字串,由於是共享位址,對它的修改會反應到每個呼叫者的。

可以這樣:

戳這裡,了解更詳細const關鍵字。

const

char* mystring()

簡單吧,簡單歸簡單,但是問題也隨之而來了。

c語言中的庫函式,tmpnam()函式、getenv()函式等應該都是採用的這種方法,這也就是為什麼,使用這樣的函式的時候應該立即將返回結果拷貝乙份的原因

這倆函式是啥?

看例程吧。。

char *tmpnam(char *str)

返回值: 乙個指向 c 字串的指標,該字串儲存了臨時檔名。如果 str 是乙個空指標,則該指標指向乙個內部緩衝區,緩衝區在下一次呼叫函式時被覆蓋。

如果 str 不是乙個空指標,則返回 str。如果函式未能成功建立可用的檔名,則返回乙個空指標。

#include 

int main()

再來看下:

char *getenv(const char *name)

返回值 該函式返回乙個以 null 結尾的字串,該字串為被請求環境變數的值。如果該環境變數不存在,則返回 null。

同樣,直接看例程吧。

#include 

#include

int main ()

既然區域性變數相當於全域性變數了,那我們直接定義全域性變數當然也是可以的!

#include 

#include

char str[12];

char* mystring()

int main()

將其作為字元指標傳入,特別注意如果此時想讓其作為字元指標為引數傳入函式,那麼它實參本身必須為字元陣列

言外之意字元指標(指向字元陣列的指標)僅僅為乙個儲存位址的地方,而字元陣列才是存東西的地方。

錯誤的示範

#include 

#include

void mystring(char *str)

int main()

正確的示範

#include 

#include

void mystring(char *str)

int main()

這種缺點,也可直接從主函式中看到,對應的x,即字元陣列的記憶體要足夠。

防止意外的溢位,可以這樣。指定長度

#include 

#include

void mystring(char *str, int len)

int main()

思路也很容易想到,還是想讓那個位址儲存住。除了靜態變數或者全域性變數外。我們還可以利用malloc 函式進行在堆中分配記憶體,但是要特別注意,堆要即時釋放!

關於記憶體分配函式再來回憶一波。。

void *malloc(unsigned size)

eg: 關於sizeof和strlen的區別戳這裡。

int p = (int )malloc(n*sizeof(int))

申請對應該機器可存放n個int的記憶體空間。

對了,還有個colloc函式,函式原型為:

void *calloc(unsigned n, unsigned size);

它和malloc函式的區別還有,calloc可以自己置0,但是malloc需要借助memset或者迴圈手動置0。

memset(a, 0, sizeof(a))

直接對應都是字元指標也無妨。。

#include 

#include

#include

char* mystring()

int main()

參考:

1、四種返回字串陣列的方法(1)

2、四種返回字串陣列的方法(2)

PHP字串函式substr 返回字串的子串

在php中,字串函式 substr 用來返回字串的子串。函式語法 substr string string int start int length string函式引數說明 引數 描述string 必需。規定要返回其中一部分的字串。start 必需。規定在字串的何處開始。length 可選。規定要...

shell函式返回字串

shell函式的返回值,僅支援return返回整數,嘗試返回字串 bin sh get str get str echo 輸出如下 test.sh line 5 return string numeric argument required 255 可以看到已經提示要求return 整數型別,真實返...

C 返回字串函式的幾種實現方法

c 返回字串函式 有四種方式 1。使用堆空間,返回申請的堆位址,注意釋放 2。函式引數傳遞指標,返回該指標 3。返回函式內定義的靜態變數 共享 4。返回全域性變數 其實就是要返回乙個有效的指標,尾部變數退出後就無效了。使用分配的記憶體,位址是有效 char fun 但這種方式需要注意,必須由使用將將...