[英]Understanding gets() function in C
我很難理解C中的一些概念,並且與我從Greg Perry的“ C編程絕對入門指南”中得到的東西混淆了。
在本書的最后,作者提到了get()函數的工作原理,他說它返回了一個字符指針,該指針指向用戶輸入的字符串的開頭,如果是這種情況(請原諒我的無知。在這方面真的很新)如何返回字符串的其余部分? 我的猜測是,它將字符數組存儲為完整字符,並將其存儲為第一個元素,如下所示:
char * names[5] = {"name1","name2","name3"};
從那里我們可以做類似的事情
printf("%s\n",*(names));
這將打印“ name1”,因為它實際上返回了數組的第一個位置。 但是這樣的事情呢:
gets(names);
printf("%s\n",*(names));
上面的示例可以很好地編譯,但是如果運行I時會給出分段錯誤。
我確定我可能沒有正確解釋這本書,但是在我看來,作者似乎說,無論用戶輸入的內容是gets(名稱),gets(在上面的示例中)都是第一個數組元素,而不是在某些方面,我最能做的就是將輸入的任何內容的第一個字母打印成名字。
我一直對這些小事情着迷,因為我覺得它們可以幫助我更好地理解C編程(以及整個編程),因此,我一定會感謝任何能為我指明正確方向的人。
C中的字符串只是內存中連續的字符序列。 該函數返回一個指向第一個字符的指針,並且通過指針算術,您可以查看其余字符。 沒有“返回字符串的其余部分”:基本上,它是按照“嘿,這是指向字符串開頭的指針。您可以從該位置開始讀取”的方式返回某些內容。
例如,如果p
是指向第一個字符的指針,則p+1
是指向下一個字符的指針,依此類推。 字符串以null終止,因此您知道何時停止。
旁注: gets()
確實很危險,因為它容易受到緩沖區溢出的影響; 它已經過時了。 沒有人應該再使用它了。 閱讀有關fgets()
。
gets()
名稱無效,類型立即不匹配。 names
衰減為char **
,並且gets()
期望為char *
。 另外,您必須提供一個指向有效內存位置的指針。
如果您這樣聲明names
:
char names[128];
然后gets(names)
將是有效的。 請注意, gets()
無法知道names
最多可容納128個字符,這就是為什么您應該使用fgets()
,該函數接收緩沖區的大小作為附加參數,以便知道其限制。
在C語言中,數組是連續內存塊的列表。 因此,由於這些塊在內存中是連續的,因此如果您擁有第一個的地址,那么您將擁有所有這些地址的地址。 例如,對於char c [3],以下等式成立:
c[0] == *c
c[1] == *(c + sizeof(char));
c[2] == *(c + sizeof(char) * 2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.