只扫描一个字符
scanf for only ONE char
我需要能够检测无关的输入并退出我的程序。
如果我在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::cin
和std::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);
相关文章:
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用动态分配将 char* 复制到另一个字符**
- 如何将一个结构的字符数组复制到结构的另一个字符数组中?
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 如何检查一个字符是否与字符数组中的另一个字符匹配?
- C++:使用另一个字符将一个字符大写
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- 使用连续分隔符和空最后一个字符进行拆分
- 如何比较文件中包含的下一个字符
- 如何检查字符串中的最后一个字符是否是某个字符并将其从字符串中删除?(C++)
- 如何从文本文件中一次读取一个字符
- 将一个字符替换为字符串中更多数量的字符,而不删除C++中的其他字母
- 读取输入后,输出丢失了一个字符
- 比较最后一个字符,不区分大小写(带谓词?
- 如果一个字符,比如说"9",我减去"0",我在结果上使用 is 数字,我是真还是假
- 为什么 std::istream::gcount 返回的字符比预期的多一个字符
- 使用 fstream 在空格分隔文件中查看下一项(不仅仅是一个字符)的方法
- 使用 char 将一个字符数组分配给另一个字符数组时出现奇怪的行为
- 在弦乐器中删除最后一个字符