字串大小的問題 -- 如何決定字串的大小,防止緩衝區溢位。
在 C 語言當中,最惱人的莫過於如何決定字串或陣列大小的這個問題了,舉例而言,在下列程式當中,我們宣告 input 大小為 5,但是我們永遠不會知道 5 到底夠不夠,萬一不夠就會造成當機,甚至被有心人士透過「緩衝區溢位」方法攻擊,這是使用 C 語言陣列時經常遇到的困擾。
程式一:很容易「緩衝區溢位」的程式
#include <stdio.h>
int main() {
char input[5];
scanf("%s", input);
printf("Your input : %s", input);
}
即使我們宣告 char input[100] 也有可能不夠,但是如果宣告 char input[10000],會不會太浪費記憶體了,到底應該如何處理呢?
其實在 scanf 這樣的函數中,可以用 %s 指定大小,以下範例就改進了上述問題,因此當輸入字串長度超過 5 時,就會被截掉,
程式二:不會造成「緩衝區溢位」的程式
#include <stdio.h>
int main() {
char input[6]; // 注意,這裡必須宣告 6=5+1,因為還有結束字元 \0。
scanf("%5s", input);
printf("Your input : %s", input);
}
執行結果
D:\cp>gcc arraySize.c -o arraySize
D:\cp>arraySize
Hello!John.
Your input : Hello