2012-06-04 31 views
3

我想限制scanf函數,所以當我輸入例如一個char* array <String...>有超過30個字符,它不會得到它,我的輸出將是錯誤的。如何限制C中的scanf函數在輸入太長時打印錯誤?

我得到了一個提示使用[^ n]或類似的東西,但我不知道該怎麼辦呢? 我知道我可以使用scanf("%30s"..)但我不希望輸入有效,只是錯誤。

任何幫助將是偉大的。

+0

我很確定沒有這樣的事情。鑑於30個符合您的轉換規範的字符,它會成功,無論是否可能還有更多。這取決於你閱讀下一個角色,並確認它是一個新行,或類似的東西(但仍然不會放回你讀的30個字符)。 –

回答

6

如果你必須使用scanf那麼我相信你能做的最好是使用寬度說明的東西,如:"%31s",因爲你已經提到的,然後使用strlen檢查輸入的長度,並丟棄該字符串並在輸入超出限制時報告錯誤。

或可能通過在格式字符串,例如另外使用一個%n跳過strlen"%31s%n"

使用類似%[^\n]代替%s的格式字符串只是指示功能繼續讀書,直到一個換行符,消費沿途其他空白字符。如果您想允許輸入包含空格字符,這很有用。

審查scanf函數的文檔(here's手冊頁的複印件)。

+0

我想你的意思是說'%31 [^ \ n]' – markgz

+0

@markgz:我做了,感謝並編輯了。 – pb2q

1

井C,可這樣做:

#include <string.h> 

... 

if(strlen(array_ptr) > 0) error(); 

顯然,你需要一個更大的緩衝實際上首先獲得輸入,然後檢查它的長度,所以陣列可能是如512字節。當你將字符串複製到它時,你需要檢查你最後得到0。

+0

:-)所以你已經被要求處理來自scanf函數的錯誤代碼 - 好吧,scanf返回的匹配數量,但如果匹配的代碼,或如何指定它,它看起來有點棘手的問題。你應該上的課你會知道;-) – Andrew

3

你可以使用fgetssscanf。使用fgets可以讀取多於30個字符,然後檢查是否沒有得到超過30個字符。

或者如果你真的想使用scanf使用它比30更像%32s

+0

我們的教授告訴我們不幸使用scanf,並給了一個提示 - scahnf(「%[^ n \ * c)但我不明白:O – user1386966

2

你可以在一個循環中使用的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(); 
    } 

這是一個最原始的例子。如果取決於我,我會分配一個最大大小的字符數組,讀取整行,然後使用字符串實用程序對其進行計數,編輯它等等。

+0

@moooeeeep – octopusgrabbus

3

看看這個頁面http://linux.die.net/man/3/sscanf並尋找%n格式說明符。我還建議尋找sscanf函數的返回值,它會告訴你格式化參數的數量,以及錯誤的存在。

我使用了%正格式說明在解析參數的字符串,以幫助:

 ret = sscanf(line, "%d %d %s %d %d %n", &iLoad, &iScreen, &filename, &stage, &bitmapType, &offset); 

由前述參數格式化字符的數量被存儲在變量偏移

0

sscanf,對於這種事情非常好,但仔細scanf也可以做到這一點。您需要確保您正確限制了用戶可以輸入的字符數,因此%31s將表示最多30個字符+空終止符(31)。

你所預防的是緩衝區溢出攻擊,它可以是非常有效的方式來打破寫入的c程序。這裏有一篇關於BO的優秀文章: http://insecure.org/stf/smashstack.html