只扫描一个字符

scanf for only ONE char

本文关键字:一个 字符 扫描      更新时间:2023-10-16

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

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

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

我知道像fgets()这样的其他函数可能更适合这一点,但我已经被指示使用scanf()函数。

我该怎么做?

读取用户输入时,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]; 

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

scanf(" %c",&var);

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

c = getch();

在scanf("%c",&var);您可以在%c之后添加一个换行符来吸收多余的字符。

scanf("%cn",&in);
相关文章: