2011-05-12 78 views
2

這將實際驗證我的用戶輸入只有兩個元素,然後換行嗎?scanf驗證C

char newline 
scanf(" %s %s%c", out, in, &newline); 
if(newline != '\n'){ 
    error(); 
} 
+0

你測試過了嗎? – karlphillip 2011-05-12 15:39:29

+2

小心點。 'out'和'in'需要有足夠的空間容納用戶輸入的內容。你應該使用'%ns',其中'n'是'out'或''''-1'指向的緩衝區的大小。所以,如果你的緩衝區長度是12個字節,那麼'%11s'。 – nmichaels 2011-05-12 15:39:41

+0

我在[20] char out [20]中有char,並且謝謝,「%20s%20x」 – Jono 2011-05-12 15:42:02

回答

3

您必須從scanf()檢查退貨狀態;如果它不返回3,那麼驗證失敗。您的支票將確保有兩個'單詞'(可能在前面有一些空格)。在第二個單詞之後,你將不會被允許放置空格。請注意,如果驗證失敗,則可能需要「吃」餘下的行 - 如果在newline中有換行符,則不會。

1

不!如果第二個字符串和換行符之間有一些空格字符,則scanf將不正確。使用getc()爲:

scanf("%s%s", buf1, buf2); 
char newline = 0; 
while((newline = getc()) == ' ' || newline == '\t'); 
if(newline != '\n'){ 
    error(); 
} 

編輯:

添加案例尾部空格。

1

是的,這將工作。但只有當輸入完全匹配時:word word<enter>

如果用戶鍵入與該格式不同的任何內容,例如第二個字與之間的空格輸入,則您的邏輯將失敗。

char newline; 
char out[50]; 
char in[50]; 
scanf("%s %s%c", out, in, &newline); 
if(newline != '\n') 
{ 
    printf("error!"); 
} 

此外,scanf shouldn't被用來從那樣的輸入中讀取。考慮使用fgets來讀取輸入並使用strtok來解析數據。