2017-10-16 206 views
0

我需要能够检测到无关的输入并退出我的程序。scanf只有一个字符

如果我在scanf("%c", &var);中输入一个多于一个字符的字符串,它会取第一个字母并将其存储到var中,但程序会继续。

我试着用if (scanf("%c", &var) != 1),但是它每次都返回1,不管输入那么它没什么区别。我知道像fgets()这样的其他函数可能更适合这个,但我被指示使用scanf()函数。

我该怎么做?

+2

'如果(scanf函数( “%C%C”,与VAR,及额外的)== 2 &&额外的!= '\ n')' – BLUEPIXY

+4

注意,你通常要至少经过一个换行符输入的字符通常更多(除非字符是换行符)。你需要决定并解释你想要做更准确的事情。以前输入了什么?角色后面输入了什么?你确定你应该担心吗? (最后一个答案可能是'是',但你需要小心你允许和禁止的内容。) –

+1

还要注意,一般情况下,你不应该用C和C++标记问题。选择你正在学习的语言,不要用另一个标记问题。 –

回答

-1

如果你只是不想你的程序等待键入 “CONIO.H”

c = getch(); 

OR

在scanf(“%定义的字符,使用的getch()后进入c“,& var);您可以在%c之后添加换行符\ n以吸收多余的字符。

scanf("%c\n",&in); 
+0

'getch()'不是**标准函数。它在MS-DOS'conio.h'和Unix nCurses库中有两个不同的版本。 – iBug

+0

是的,主要目标是解决这个问题,我给了我两种方法。我没有看到这个问题! @iBug –

0

当读取用户输入时,scanf可以从文件或控制台获取其输入。

从控制台读取数据时,只有在添加换行符时数据才可用于程序。这意味着任何在同一行输入的内容都被读取。

想象我有一个迷宫程序,并要我选择哪个方向走....

while(!atGoalLocation()) { 
    printf("Which direction (f)orward (l)eft (r)ight?\n"); 
    scanf("%c", &dir); 
    processDirection(dir); 
} 

我既可以通过迷宫进入路线为

f 
l 
f 
r 
f 
f 

或者它也可能是正确的,进入我的输入作为

flfrff 

根据您的任务,他们可能意味着同样的事情。

如果您想要允许这些输入中的任何一个,请确保通过向scanf添加“”来吃掉空白区域。

if(scanf(" %c", &dir) == 1) 

如果断行版本是要接受的唯一方法,那么你应该分开的线,然后尝试进行扫描。

char line[200]; 
while(fgets(line, sizeof(line), stdin) != NULL){ 
     sscanf(line, "%c", &dir); 

也为C++,我们应该使用std::cinstd::cout。然而,同一行上的未读字符会出现同样的复杂情况,所以我仍然会使用基于行的解析器。

std::string line; 
while(std::getline(std::cin, line)){ 
    // here we could parse the line using std::strstream to decode more complext things than a char. 
    dir = line[0];