scanf只有一个字符

时间:2017-10-16 02:09:45

标签: c++

我需要能够检测到无关的输入并退出我的程序。

如果我将一个超过1个字符串的字符串输入<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> </script> <table id="one"> <th>Date</th> <th>Skip days</th> <th>Result</th> <tbody> <tr> <td> <input type="date" class="date"></td> <td><input type="text" value="10" class="day"> </td> <td><input type="text" class="result"> </td> </tr> <tr> <td> <input type="date" class="date"></td> <td><input type="text" value="15" class="day"> </td> <td><input type="text" class="result"> </td> </tr> <tr> <td> <input type="date" class="date"></td> <td><input type="text" value="last" class="day"> </td> <td><input type="text" class="result"> </td> </tr> </tbody> </table>,它会收取第一个字母并将其存储到var中,但程序会继续。

我尝试使用scanf("%c", &var);但每次无论输入都返回1,所以没有区别。

我知道其他函数如fgets()可能更适合这个但我已被指示使用scanf()函数。

我该怎么做?

3 个答案:

答案 0 :(得分: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

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

如果您想允许这些输入中的任何一个,那么请确保通过添加&#34;来占用空白区域。 &#34;到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]; 

答案 1 :(得分:0)

您需要在%c之前添加一个空格:

scanf(" %c",&var);

答案 2 :(得分:-1)

如果您不希望程序在输入字符后等待输入,请使用“conio.h”中定义的getch()

c = getch();

OR

在scanf(“%c”,&amp; var)中;您可以在%c之后添加换行符\ n以吸收额外的字符。

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