首页 > 解决方案 > 检查没有转换的scanf格式

问题描述

有没有办法在不使用字符转换的情况下使用 scanf 检查输入时是否给出了某些特定字符?

int main(void)
{
if(scanf("{ ["))
    printf("GOOD INPUT\n");
else
    printf("BAD INPUT\n");
return 0;
}     

这段代码总是给出错误的输入选项(它期望 scanf 返回值为 1),但有趣的是,如果我输入的不是所需的字符,它会立即给出错误的输入,但如果我按照 scanf 中的指定输入它,它会破坏错误的输入在我输入整个输入之后。

所以它必须等待输入采用指定的格式,但我的问题是:我如何在没有任何转换的情况下检查它,并根据输入是否正确输入而做出相应的操作?

标签: c++cscanf

解决方案


您可以使用%n转换scanf(它在下面设置为pos到目前为止读取的字符数)

int pos= -1;
if (scanf("{ [%n", &pos) >=0 && pos>0) 
   printf("GOOD INPUT\n");
else 
   printf("BAD INPUT");

请注意,返回计数scanf可能是特定于实现的(它可能保持在 0)。但是 pos被分配到scanfdid get的正偏移量{后跟一些(零个或多个)类似空格的字符,后跟一个[.

但是,您可能想要的是一些词法分析解析,那么 scanf这不是一个好的解决方案。您最好阅读整行(例如 withfgetsgetline)并稍后解析它。

另见scanf(3)man的页面


推荐阅读