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))對了,還有個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 但這種方式需要注意,必須由使用將將...