簡體   English   中英

了解C語言中的gets()函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM