emm,,c語言字串和指標兩大精華,得之得c天下。另外關於字串的另一些博文:其實有乙個問題,原來一直困擾著自己,只是自己總是選擇忽略,今天又暴露了出來,必須得去解決一下了。
1、字元陣列和字元指標的比較學習2、字串那些事。
q:如何在乙個函式返回字元陣列(或者字串)呢?下面給出四種返回字串的方法:
1、 將字串指標作為函式引數傳入,並返回該指標。
2、 使用malloc函式動態分配記憶體,注意在主調函式中釋放。
3、 返回乙個靜態區域性變數。
4、 使用全域性變數。
當然各有利弊,就拿乙個例子來具體學習下吧。
cb編譯後 。。。#include
#include
char* mystring()
int main()
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()
這種缺點,也可直接從主函式中看到,對應的x,即字元陣列的記憶體要足夠。#include
#include
void mystring(char *str)
int main()
防止意外的溢位,可以這樣。指定長度。
思路也很容易想到,還是想讓那個位址儲存住。除了靜態變數或者全域性變數外。我們還可以利用malloc 函式進行在堆中分配記憶體,但是要特別注意,堆要即時釋放!#include
#include
void mystring(char *str, int len)
int main()
關於記憶體分配函式再來回憶一波。。
void *malloc(unsigned size)eg: 關於sizeof和strlen的區別戳這裡。
int p = (int )malloc(n*sizeof(int))對了,還有個colloc函式,函式原型為:申請對應該機器可存放n個int的記憶體空間。
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 但這種方式需要注意,必須由使用將將...