2013-02-27 44 views
1
scanf("%s %d %s %d",word1,&num1,word2,&num2); 

所以当用户输入“quit”时,它应该停止询问其他3个输入。然而它要求我输入另一个“退出”,可能是因为格式中有2%s如何让多个输入的scanf()忽略其他?

反正这里有吗? 编辑:因为它必须在循环中获得4个输入,除非输入退出。

+0

你可以有一个更奇特的输入解析。也许你可以用'flex' +'bison'或'antlr'? – 2013-02-27 19:22:10

+2

@BasileStarynkevitch人们可以理解为什么你建议只有在看到你的个人资料并发现你是GCC核心黑客时,才能为4个字的用户输入编写一个完整的LALR解析器:P – 2013-02-27 19:24:06

+0

并不是说只有4个不同的用户输入文字.... – 2013-02-27 19:26:47

回答

3

scanf是一种非常生硬的工具,不擅长说话的非结构化输入(包括人类:-))。一般来说,如果您正在与某个人互动,您应该从fgets开始阅读一行,然后选择最后一行,但最方便,可能包括sscanf

这比你想象的要糟糕,因为%d指令会给你提供一些不可扫描的东西作为整数。例如,如果您输入quit now,则第一个%s指令将读取单词quit,但%d将在输入流中保留now,导致scanf返回1(一次成功的转换和分配)。读取字符串的下一次尝试将获取并使用now;到幼稚的代码,这看起来像是后面的第二条输入行,而不是第一条输入行的延续。

+1

+1提及'scanf()'不起作用,我们认为它的确如此。例如,也许你可以建议一个替代方案,例如'fgets()'。 – 2013-02-27 19:37:02

+1

@ H2CO3:第二行建议以'fgets'开头。 :-) – torek 2013-02-27 19:58:56

2
#include <stdio.h> 
#include <string.h> 

scanf("%s ", word1); 
if (strcmp(word1, "quit") != 0) 
    scanf("%d %s %d", &num1, word2, &num2);