在 Linux 中,安全地讀取字符串的關鍵是使用合適的函數和庫,以防止緩沖區溢出、內存泄漏等安全問題
fgets()
函數:
fgets()
函數可以從文件流(例如標準輸入)中讀取字符串。這個函數會自動在讀取的字符串后面添加空字符(‘\0’),并且可以指定讀取的最大字符數,從而避免緩沖區溢出。示例代碼:
#include<stdio.h>
int main() {
char buffer[256];
printf("請輸入字符串:");
fgets(buffer, sizeof(buffer), stdin);
printf("你輸入的字符串是:%s", buffer);
return 0;
}
getline()
函數:
getline()
函數可以動態分配足夠的內存來存儲讀取的字符串。這意味著你不需要預先分配一個固定大小的緩沖區。當不再需要字符串時,需要使用 free()
函數釋放內存。示例代碼:
#include<stdio.h>
#include <stdlib.h>
int main() {
char *buffer = NULL;
size_t len = 0;
ssize_t read_chars;
printf("請輸入字符串:");
read_chars = getline(&buffer, &len, stdin);
if (read_chars != -1) {
printf("你輸入的字符串是:%s", buffer);
}
free(buffer);
return 0;
}
scanf()
函數的 %ms
格式說明符:
%ms
格式說明符會自動為字符串分配內存,并將讀取的字符串存儲在一個指針變量中。當不再需要字符串時,需要使用 free()
函數釋放內存。示例代碼:
#include<stdio.h>
#include <stdlib.h>
int main() {
char *buffer;
printf("請輸入字符串:");
scanf("%ms", &buffer);
printf("你輸入的字符串是:%s", buffer);
free(buffer);
return 0;
}
注意:%ms
格式說明符是 GNU 擴展,可能不被所有 C 庫支持。在使用前,請確保你的編譯器和庫支持這個特性。