我已將字串的大小設定word為 5。我正在接受輸入,scanf()格式說明符是%s. 雖然字串的大小是 5,但如果我輸入一個比長度 5 更大的字串,它也會占用整個輸入。為什么會這樣?
這是我的 C 程式:
#include <stdio.h>
#include <string.h>
int main() {
char word[5];
printf("Enter word: ");
scanf("%s", word);
printf("Word: %s\n", word);
strlwr(word);
printf("To Lower: %s\n", word);
return 0;
}
如果我輸入AbcDEfghij哪個長度是 10 但它會接受這個并正確列印完整的字串。我怎樣才能防止這種情況?我不想接受大于大小的輸入。
uj5u.com熱心網友回復:
C 不對陣列執行邊界檢查。這是使它快速的部分原因。然而,這也意味著它允許你做一些你不應該喜歡寫的超出陣列邊界的事情。當你這樣做時,你會觸發未定義的行為。
當您的程式有未定義的行為時,它可能會崩潰,可能會產生奇怪的結果,或者它可能(如您的情況)似乎正常作業。更糟糕的是,看似無關的更改(例如添加未使用的區域變數或添加printf除錯呼叫)可能會改變未定義行為的表現方式。
總而言之,語言相信你不會做你不應該做的事情。
uj5u.com熱心網友回復:
您看到緩沖區溢位。在 C 中,字串表示為一個位元組字符陣列,以 NULL 字符結尾。scanf 不知道您的緩沖區有多大,并且很樂意將任何輸入復制到其中。這種漏洞會導致一類安全漏洞,稱為緩沖區溢位攻擊。這可能會導致有趣的結果,例如這個例子,它被設定為以 123456 作為輸入,你會溢位你的字符陣列,它應該輸出值 54,對應于 6 的 Ascii 代碼。
#include <stdio.h>
#include <stdint.h>
struct overflow_test{
char buffer[5];
uint8_t number;
};
int main()
{
struct overflow_test s;
s.number=6;
printf("%d\n", s.number);
printf("\n");
scanf("%s", &s.buffer);
printf("%d\n", s.number);
return 0;
}
您有責任確保接收的字符數不會超過緩沖區所能容納的字符數。為避免此問題,您可以改用 fgets 之類的函式,該函式接收最大數量的字符,以免緩沖區溢位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/363035.html
下一篇:DocumentationFile和GenerateDocumentationFile可以在.Net專案檔案中一起使用嗎?
