簡體   English   中英

scanf()中的緩沖區溢出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM