[英]scanf error handling C
說如果我想輸入
[Name] [Name]
我將如何檢測
[Name] [Name] [Name]
並返回錯誤?
這是我到目前為止的一切
char in[20];
char out[20];
scanf(" %s %s", out, in);
這是家庭作業,因此可能需要您在某些(任意)限制下工作。 但是,短語“ scanf
錯誤處理”在C編程語言中有點矛盾。
最好的方法是讀取一行/其他合適的塊,然后使用C字符串函數對其進行解析。 您可以在scanf
一行中完成此操作,但是有很多缺點:
scanf
的"%["
格式的行為。 scanf
還使您幾乎無法控制如何處理空白。 編輯:我最初從您的問題中想到,名稱包含在方括號中(例如“ la "[Bruce] [Wayne]"
),但現在看來,這僅僅是您用來表示占位符的約定。
無論如何,盡管我非常不喜歡scanf
,但是它有其用途。 (對我而言)最大的殺手是無法區分行尾和簡單的空格分隔。 要解決此問題,可以調用fgets
將數據讀入緩沖區, 然后在緩沖區上調用sscanf
。 這既給您帶來以下好處:a)更安全的讀取( scanf
與其他更直接的函數從緩沖區讀取的功能混為一談),以及b) scanf
格式的優點。
如果必須使用scanf
,則格式基本上是這樣的:
" %s %s %s"
第三是不可取的。 正如@Constantinius的答案所示,您需要將數據讀入三個緩沖區,並檢查是否通過了第三個緩沖區。 但是,如果您正在讀取該數據的多個連續行,那么下一行的第一個條目將滿足第三個插槽,錯誤地給您一個錯誤。 我強烈建議使用fgets
和sscanf
或放棄sscanf
以便在這種情況下進行更精確的手動解析。
如果您錯過了我之前fgets
頁面,那么這里是fgets
手冊頁的鏈接。 如果您決定拋棄sscanf
,還可以考慮以下其他功能: strchr
(或strspn
或strcspn
)來查找名稱的長度, strcpy
或memcpy
(但請不要使用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.