gets()
是 C 語言中的一個函數,用于從標準輸入(通常是鍵盤)讀取一行文本,并將其存儲在指定的字符數組中。然而,gets()
函數存在一些常見的問題和潛在的安全風險,因此在現代 C 編程中已經不推薦使用。
以下是 gets()
函數的一些常見問題:
gets()
函數不檢查目標數組的大小,它會將讀取的文本一直讀取到遇到換行符或EOF(文件結束符)為止。這可能導致緩沖區溢出,從而覆蓋數組中的其他數據或允許攻擊者執行任意代碼。null
終止符:gets()
函數在讀取文本后不會自動在末尾添加 null
終止符(\0
)。這可能導致后續的字符串操作函數(如 strlen()
、strcpy()
等)無法正確工作,因為它們依賴于 null
終止符來識別字符串的結束位置。gets()
函數不檢查緩沖區大小,因此它可能會讀取超出數組容量的文本。這可能導致不可預測的行為,包括程序崩潰、數據損壞或安全漏洞。為了解決這些問題,C11 標準引入了 fgets()
函數,它允許你指定緩沖區的大小,并在讀取文本后自動添加 null
終止符。因此,在現代 C 編程中,建議使用 fgets()
函數來代替 gets()
函數。
下面是一個使用 fgets()
函數的示例:
#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;
}
在這個示例中,fgets()
函數讀取一行文本并將其存儲在 buffer
數組中。strcspn()
函數用于查找第一個換行符在 buffer
中的位置,并將該位置的字符替換為 null
終止符,以確保字符串的正確終止。