C++中与指定格式scanf_s代码等效的cin实现方式是什么
等效实现
你给出的scanf_s要求输入严格匹配x=整数(mod 整数)的格式,直接用cin >>默认只会跳过空白字符,不会主动匹配固定格式文本,所以需要手动处理格式里的固定字符部分,以下是兼容C++11及以上版本的写法:
#include <iostream> #include <limits> // 需引入该头文件使用numeric_limits // 业务逻辑处代码 char tmp; cin >> tmp; if (tmp != 'x') cin.setstate(std::ios::failbit); cin >> tmp; if (tmp != '=') cin.setstate(std::ios::failbit); cin >> a[i]; cin >> tmp; if (tmp != '(') cin.setstate(std::ios::failbit); cin >> tmp; if (tmp != 'm') cin.setstate(std::ios::failbit); cin >> tmp; if (tmp != 'o') cin.setstate(std::ios::failbit); cin >> tmp; if (tmp != 'd') cin.setstate(std::ios::failbit); cin >> tmp; if (tmp != ' ') cin.setstate(std::ios::failbit); cin >> b[i]; // 匹配格式末尾的换行,跳过剩余空白直到行尾,和原scanf中\n的效果一致 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
如果你的编译环境支持C++23,可以用标准库新增的std::scan,写法和scanf几乎完全一致,非常简洁:
#include <scan> // C++23新增头文件 std::scan(cin, "x={}(mod {})", a[i], b[i]);
说明
你之前使用的cin >> a[i] >> b[i]仅适用于输入值之间只用空白分隔的场景,不需要匹配额外固定文本。如果输入有自定义的格式分隔符,要么按照上面的方案手动匹配固定字符,要么用C++23的std::scan直接解析格式串即可。
内容的提问来源于stack exchange,提问作者GoAkshay
相关产品推荐
相关产品推荐

