簡體   English   中英

scanf錯誤處理C

[英]scanf error handling C

說如果我想輸入

[Name] [Name]

我將如何檢測

[Name] [Name] [Name] 

並返回錯誤?

這是我到目前為止的一切

char in[20];
char out[20];
scanf(" %s %s", out, in);

這是家庭作業,因此可能需要您在某些(任意)限制下工作。 但是,短語“ scanf錯誤處理”在C編程語言中有點矛盾。

最好的方法是讀取一行/其他合適的塊,然后使用C字符串函數對其進行解析。 您可以在scanf一行中完成此操作,但是有很多缺點:

  1. 您可以防止緩沖區溢出,但是如果緩沖區不夠大,您將無法恢復。
  2. 您可以為字符串指定特定的字符范圍,但是看起來有點老套,標准中沒有強制規定scanf"%["格式的行為。
  3. 您可以檢查第三個名稱,但是代碼看起來不直觀-它看起來不像只需要兩個名稱,而是像您想要三個名稱。 scanf還使您幾乎無法控制如何處理空白。

編輯:我最初從您的問題中想到,名稱包含在方括號中(例如“ la "[Bruce] [Wayne]" ),但現在看來,這僅僅是您用來表示占位符的約定。

無論如何,盡管我非常不喜歡scanf ,但是它有其用途。 (對我而言)最大的殺手是無法區分行尾和簡單的空格分隔。 要解決此問題,可以調用fgets將數據讀入緩沖區, 然后在緩沖區上調用sscanf 這既給您帶來以下好處:a)更安全的讀取( scanf與其他更直接的函數從緩沖區讀取的功能混為一談),以及b) scanf格式的優點。

如果必須使用scanf ,則格式基本上是這樣的:

" %s %s %s"

第三是不可取的。 正如@Constantinius的答案所示,您需要將數據讀入三個緩沖區,並檢查是否通過了第三個緩沖區。 但是,如果您正在讀取該數據的多個連續行,那么下一行的第一個條目將滿足第三個插槽,錯誤地給您一個錯誤。 我強烈建議使用fgetssscanf或放棄sscanf以便在這種情況下進行更精確的手動解析。

如果您錯過了我之前fgets頁面,那么這里是fgets手冊頁的鏈接。 如果您決定拋棄sscanf ,還可以考慮以下其他功能: strchr (或strspnstrcspn )來查找名稱的長度, strcpymemcpy (但請不要使用strncpy ,這不是您認為的那樣)將數據復制到緩沖區。

scanf返回有效轉換的參數數。 因此,在您的第一種情況下,返回值為2,在后一種情況下為3。

要檢查正確數量的參數,這可能會有所幫助:

char in[20];
char out[20];
char error[20];
int check;

check = scanf(" %s %s %s", out, in, error);
if(check != 2)
{
    // TODO: error handling
}

編輯:現在它應該工作,請參閱下面的注釋。

當然,正如其他發布者所述:scanf並不是一個非常安全的函數,因為可能會發生緩沖區溢出,因此應避免使用它。 最好使用fgets()將輸入讀取到緩沖區,然后嘗試解析所需的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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