2011-05-12 70 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来解析数据。