我想限制scanf函數,所以當我輸入例如一個char* array <String...>
有超過30個字符,它不會得到它,我的輸出將是錯誤的。如何限制C中的scanf函數在輸入太長時打印錯誤?
我得到了一個提示使用[^ n]或類似的東西,但我不知道該怎麼辦呢? 我知道我可以使用scanf("%30s"..)
但我不希望輸入有效,只是錯誤。
任何幫助將是偉大的。
我想限制scanf函數,所以當我輸入例如一個char* array <String...>
有超過30個字符,它不會得到它,我的輸出將是錯誤的。如何限制C中的scanf函數在輸入太長時打印錯誤?
我得到了一個提示使用[^ n]或類似的東西,但我不知道該怎麼辦呢? 我知道我可以使用scanf("%30s"..)
但我不希望輸入有效,只是錯誤。
任何幫助將是偉大的。
井C,可這樣做:
#include <string.h>
...
if(strlen(array_ptr) > 0) error();
顯然,你需要一個更大的緩衝實際上首先獲得輸入,然後檢查它的長度,所以陣列可能是如512字節。當你將字符串複製到它時,你需要檢查你最後得到0。
:-)所以你已經被要求處理來自scanf函數的錯誤代碼 - 好吧,scanf返回的匹配數量,但如果匹配的代碼,或如何指定它,它看起來有點棘手的問題。你應該上的課你會知道;-) – Andrew
你可以使用fgets
和sscanf
。使用fgets
可以讀取多於30
個字符,然後檢查是否沒有得到超過30
個字符。
或者如果你真的想使用scanf
使用它比30
更像%32s
。
我們的教授告訴我們不幸使用scanf,並給了一個提示 - scahnf(「%[^ n \ * c)但我不明白:O – user1386966
你可以在一個循環中使用的getchar,並計算字符的到來。
int iCharCount = 0;
ch = getchar();
while(ch != EOF) {
iCharCount++;
if(30 < iCharCount)
{
printf("You have attempted to enter more than 30 characters.\n");
printf("Aborting.");
break;
}
printf("%c", ch);
ch = getchar();
}
這是一個最原始的例子。如果取決於我,我會分配一個最大大小的字符數組,讀取整行,然後使用字符串實用程序對其進行計數,編輯它等等。
@moooeeeep – octopusgrabbus
看看這個頁面http://linux.die.net/man/3/sscanf並尋找%n格式說明符。我還建議尋找sscanf函數的返回值,它會告訴你格式化參數的數量,以及錯誤的存在。
我使用了%正格式說明在解析參數的字符串,以幫助:
ret = sscanf(line, "%d %d %s %d %d %n", &iLoad, &iScreen, &filename, &stage, &bitmapType, &offset);
由前述參數格式化字符的數量被存儲在變量偏移。
sscanf
,對於這種事情非常好,但仔細scanf
也可以做到這一點。您需要確保您正確限制了用戶可以輸入的字符數,因此%31s將表示最多30個字符+空終止符(31)。
你所預防的是緩衝區溢出攻擊,它可以是非常有效的方式來打破寫入的c程序。這裏有一篇關於BO的優秀文章: http://insecure.org/stf/smashstack.html
我很確定沒有這樣的事情。鑑於30個符合您的轉換規範的字符,它會成功,無論是否可能還有更多。這取決於你閱讀下一個角色,並確認它是一個新行,或類似的東西(但仍然不會放回你讀的30個字符)。 –