c++ - 检查没有转换的scanf格式
问题描述
有没有办法在不使用字符转换的情况下使用 scanf 检查输入时是否给出了某些特定字符?
int main(void)
{
if(scanf("{ ["))
printf("GOOD INPUT\n");
else
printf("BAD INPUT\n");
return 0;
}
这段代码总是给出错误的输入选项(它期望 scanf 返回值为 1),但有趣的是,如果我输入的不是所需的字符,它会立即给出错误的输入,但如果我按照 scanf 中的指定输入它,它会破坏错误的输入在我输入整个输入之后。
所以它必须等待输入采用指定的格式,但我的问题是:我如何在没有任何转换的情况下检查它,并根据输入是否正确输入而做出相应的操作?
解决方案
您可以使用%n
转换scanf
(它在下面设置为pos
到目前为止读取的字符数)
int pos= -1;
if (scanf("{ [%n", &pos) >=0 && pos>0)
printf("GOOD INPUT\n");
else
printf("BAD INPUT");
请注意,返回计数scanf
可能是特定于实现的(它可能保持在 0)。但是 pos
被分配到scanf
did get的正偏移量{
后跟一些(零个或多个)类似空格的字符,后跟一个[
.
但是,您可能想要的是一些词法分析和解析,那么 scanf
这不是一个好的解决方案。您最好阅读整行(例如 withfgets
或getline)并稍后解析它。
另见scanf(3)man
的页面
推荐阅读
- flutter - 我的 textview 只是让我底部溢出像素。我已经尝试将其放入扩展的单子滚动视图中,但仍然收到相同的错误?
- windows - WMI 类无效,但“WMI 存储库是一致的”
- vaadin20 - 子组件内的路由
- java - 最后一个分区需要很长时间才能保存到 S3 存储桶 spark RDD
- inno-setup - 从 Inno Setup 的最后完成页面中删除图像
- icc - 读取 ICC 卡记录的 APDU 序列在 AID 选择应用程序时失败(给出 SWA SWB 6283 的响应)
- angular - 错误:NG0302:找不到管道“myFilter”!运行 ng 测试时
- javascript - 迭代大量数据的最佳方法
- python-3.x - 日志 | error() 被发送到 FileHandler... 但不是其他日志记录级别
- javascript - 如何将单元格值设置为打印标题而不是 URL