gets()
函數(shù)是 C 語言中的一個歷史遺留函數(shù),用于從標準輸入(通常是鍵盤)讀取一行文本,并將其存儲到指定的字符數(shù)組中。然而,使用 gets()
函數(shù)時需要注意以下幾點:
gets()
函數(shù)不進行邊界檢查,它會將輸入的文本一直讀取到遇到換行符或EOF為止。這可能導致緩沖區(qū)溢出,從而引發(fā)安全漏洞。例如,如果數(shù)組只分配了 5 個字符的空間,但用戶輸入了 10 個字符,那么多余的字符將會覆蓋數(shù)組的其他部分,甚至可能覆蓋其他變量的值。這種緩沖區(qū)溢出的風險在 scanf()
函數(shù)中也存在,但由于 gets()
不檢查緩沖區(qū)大小,因此其風險更為嚴重。gets()
函數(shù)的安全性問題,C11 標準已經(jīng)將其廢棄(deprecated),并在 C17 標準中被移除?,F(xiàn)代 C 語言編程中建議使用 fgets()
函數(shù)代替 gets()
。fgets()
函數(shù)允許指定接收字符串的最大長度,從而有效防止緩沖區(qū)溢出。gets()
函數(shù)的簡單示例,但請注意,在實際編程中應避免使用該函數(shù)。#include <stdio.h>
int main() {
char buffer[10];
printf("Enter a string: ");
gets(buffer); // 不安全的操作,可能導致緩沖區(qū)溢出
printf("You entered: %s", buffer);
return 0;
}
fgets()
函數(shù)可以更安全地讀取字符串。下面是一個使用 fgets()
的示例:#include <stdio.h>
int main() {
char buffer[10];
printf("Enter a string (max 9 characters): ");
fgets(buffer, sizeof(buffer), stdin); // 更安全的操作
buffer[strcspn(buffer, "\n")] = 0; // 去除換行符
printf("You entered: %s", buffer);
return 0;
}
在這個示例中,fgets()
函數(shù)限制了最多讀取 9 個字符(加上一個終止字符 \0
),從而避免了緩沖區(qū)溢出的風險。同時,使用 strcspn()
函數(shù)去除了輸入字符串末尾的換行符。