我想知道为什么以下代码无法正常工作:
#include <iostream>
#include <string>
using namespace std;
int main(){
int n;
string s;
//scanf("%d",&n);
cin >> n;
ios_base::sync_with_stdio(false);
cin >> s;
cout << n << " " << s;
return 0;
}
输入:
10
abcd
输出:10
字符串未打印!如果我使用scanf
输入整数,结果是一样的。但是,如果行ios_base::sync_with_stdio(false);
放在第一个cin
之前(或scanf
之前),代码会按预期工作。
我非常感谢任何帮助澄清这种行为。
修改
输入包含在文件inp.txt
中,我使用<
(重定向运算符)从文件中读取,>
将结果输出到out.txt
,就像:
a.out < inp.txt > out.txt
如果输入直接来自控制台,则代码会给出预期输出。对于任何误解或混淆,我们深表歉意。
答案 0 :(得分:1)
在执行了 I / O之后调用sync_with_stdio
会导致实现定义的行为(这比cppreference的“有效”更强“)
效果:如果在通话前使用标准流进行了任何输入或输出操作,则效果为 实现定义。否则,使用false参数调用它 允许标准流独立于标准C运行 流。
在libc ++中,没有任何反应,因为它只是切换一个标志。在libstdc ++中,它实际上执行logic来切换流。任何进一步尝试使用流都会导致失败:
cin >> s;
cin.clear();
cin >> s;
std::cout << n << " " << s;
无论哪种方式,the libstdc++ manual都指出您需要在执行I / O之前调用函数。所以你实际拥有的是现在未定义的行为。