gets()
是 C 語言中的一個(gè)函數(shù),用于從標(biāo)準(zhǔn)輸入(通常是鍵盤)讀取一行文本,并將其存儲(chǔ)在指定的字符數(shù)組中。然而,gets()
函數(shù)存在一些常見的問題和潛在的安全風(fēng)險(xiǎn),因此在現(xiàn)代 C 編程中已經(jīng)不推薦使用。
以下是 gets()
函數(shù)的一些常見問題:
gets()
函數(shù)不檢查目標(biāo)數(shù)組的大小,它會(huì)將讀取的文本一直讀取到遇到換行符或EOF(文件結(jié)束符)為止。這可能導(dǎo)致緩沖區(qū)溢出,從而覆蓋數(shù)組中的其他數(shù)據(jù)或允許攻擊者執(zhí)行任意代碼。null
終止符:gets()
函數(shù)在讀取文本后不會(huì)自動(dòng)在末尾添加 null
終止符(\0
)。這可能導(dǎo)致后續(xù)的字符串操作函數(shù)(如 strlen()
、strcpy()
等)無法正確工作,因?yàn)樗鼈円蕾囉?null
終止符來識(shí)別字符串的結(jié)束位置。gets()
函數(shù)不檢查緩沖區(qū)大小,因此它可能會(huì)讀取超出數(shù)組容量的文本。這可能導(dǎo)致不可預(yù)測的行為,包括程序崩潰、數(shù)據(jù)損壞或安全漏洞。為了解決這些問題,C11 標(biāo)準(zhǔn)引入了 fgets()
函數(shù),它允許你指定緩沖區(qū)的大小,并在讀取文本后自動(dòng)添加 null
終止符。因此,在現(xiàn)代 C 編程中,建議使用 fgets()
函數(shù)來代替 gets()
函數(shù)。
下面是一個(gè)使用 fgets()
函數(shù)的示例:
#include <stdio.h>
#include <string.h>
int main() {
char buffer[100];
printf("Enter a string: ");
fgets(buffer, sizeof(buffer), stdin);
buffer[strcspn(buffer, "\n")] = 0; // 去除換行符
printf("You entered: %s\n", buffer);
return 0;
}
在這個(gè)示例中,fgets()
函數(shù)讀取一行文本并將其存儲(chǔ)在 buffer
數(shù)組中。strcspn()
函數(shù)用于查找第一個(gè)換行符在 buffer
中的位置,并將該位置的字符替換為 null
終止符,以確保字符串的正確終止。