[英]Buffer overflow in scanf()
我在網上尋找解決此問題的方法,但沒有結果。 我正在嘗試使用whilef循環使用scanf()僅讀取字符。 如果用戶鍵入的字符超過3個,則會顯示錯誤。
但是,如果我鍵入3個字符並按Enter,則我的代碼將部分起作用,而無需執行循環,這就是我想要的。 如果我鍵入4個字符並按Enter也可以執行循環,並說“太長”(與5個字符相同),請輸入我想要的內容。
但是,如果我鍵入7個字符並輸入,則會執行循環並立即退出程序。 有什么建議嗎?
附言 對於任何語法錯誤,我深表歉意,但英語是我的第二語言。
#include<stdio.h>
int main(){
char alo;
char alo1;
char alo2;
char alo3;
printf("enter 3 characters: ");
scanf(" %c %c %c%c", &alo, &alo1, &alo2, &alo3);
while(alo3!='\r' && alo3!='\n'){
printf("too long \n");
printf("enter ");
scanf(" %c %c %c%c", &alo, &alo1, &alo2, &alo3);
}
return 0;
}
scanf()
僅使用scanf()
即可實現這一目標,需要一定量的拼圖游戲。 這不是最好的編碼方式,但是…
#include <stdio.h>
int main(void)
{
char alo0;
char alo1;
char alo2;
char alo3;
printf("enter 3 characters: ");
while (scanf(" %c %c %c%c", &alo0, &alo1, &alo2, &alo3) == 4 &&
alo3 != '\r' && alo3 != '\n')
{
char buffer[4096];
if (scanf("%4095[^\n]", buffer) == EOF)
break;
printf("too long\n");
printf("enter 3 characters: ");
}
printf("Got [%c][%c][%c]\n", alo0, alo1, alo2);
return 0;
}
while()
條件使用scanf()
讀取四個字符,在前三個字符之前跳過空格。 注意,可以在字符之間插入換行符。 scanf()
不在乎。 如果您需要基於行的輸入,那么scanf()
就是該工作的錯誤工具! 但是,假設讀取了4個字符,而第四個字符既不是回車也不是換行符,則代碼使用:
char buffer[4096];
if (scanf("%4095[^\n]", buffer) == EOF)
break;
讀取直到但不包括換行符的任何字符。 不介意是否沒有這樣的字符,所以scanf()
返回0。然后代碼提示您輸入正確的數據並轉到主scanf()
。 這將跳過留下的換行符,然后再次查找三個字符。
當while
循環退出時,可能是因為它具有三個字符和一個換行符,或者是因為它具有較少的字符和EOF,或者是由於清理scanf()
檢測到了EOF。 該代碼不會嘗試區分這些(但應該),而只是打印出三個值。 修復並不困難; 只需將每個scanf()
的返回值分配給一個變量,然后在循環后進行測試:
int rc;
while ((rc = scanf(…)) == 4 && …)
{
…
if ((rc = scanf(…)) == EOF)
break;
…
}
if (rc == 4)
printf(…);
else
printf("Didn't get 3 characters as requested\n");
fgets()
進行行輸入 就個人而言,我認為使用fgets()
和sscanf()
這樣更容易/更好:
#include <stdio.h>
int main(void)
{
char alo0;
char alo1;
char alo2;
char alo3;
char buffer[4096];
int rc = 0;
printf("enter 3 characters: ");
while (fgets(buffer, sizeof(buffer), stdin) != 0 &&
(rc = sscanf(buffer, " %c %c %c%c", &alo0, &alo1, &alo2, &alo3)) == 4 &&
alo3 != '\r' && alo3 != '\n')
{
printf("too long\n");
printf("enter 3 characters: ");
// In case you get 4 characters but the 4th was not a newline
// and then you get EOF
rc = 0;
}
if (rc == 4)
printf("Got [%c][%c][%c]\n", alo0, alo1, alo2);
else
printf("Didn't get 3 characters as requested\n");
return 0;
}
這可能會報告字符串太長或不正確的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.