int main()
{
char a[101];
cout << "str a:";
gets(a);
return 0;
}
为什么gets(a);
在cout<<"str a:";
之前执行?
编译器使用:数字火星和GNN_gcc。
答案 0 :(得分:8)
为什么
gets(a);
在cout<<"str a:";
之前执行?
gets()
实际上并未在cout<<"str a:";
之前执行,您只是错过了flush()
输出流以强制在屏幕上打印:
cout<<"str a:" << flush;
应该解决这个问题。
正如@Slava's answer中所述,流式输出已缓冲,通常与std::cin
同步。
只有缓冲区已满或被强制使用flush()
功能时,输出才真正放在设备上。
由于gets()
是(同时弃用的)C函数,因此无法保证自动同步,除非您调用
std::ios::sync_with_stdio();
进入main()
功能后(请参阅documentation)。
旁注:
而不是使用c ++ 14标准弃用的gets()
,而应该使用
std::string a; // Much more convenient than char a[100];
std::getline(std::cin,a);
答案 1 :(得分:2)
这里为什么得到(a);正在cout之前执行&lt;&lt;&#34; str a:&#34 ;;?
不是。您可能会认为因为cout
输出已缓冲,并且在调用gets()
之前未对其进行刷新。 std::cout
知道std::cin
并且在您从那里获得输入之前会刷新。如果您使用C呼叫输入,则需要手动刷新std::cout
,或致电sync_with_stdio
答案 2 :(得分:1)
gets()
和cout
的缓冲区不同。由于没有任何东西迫使cout
刷新缓冲区,因此当执行到达gets()
函数时,内容会保留在缓冲区中。强制结果符合您的期望和执行顺序:
选项1:使用cout << "str a:" << endl;
强制刷新缓冲区内容。如果您真的不需要换行,也可以使用flush
。
选项2:使用使用相同缓冲区和/或相互识别的读取器/写入器功能。例如,使用cin >> a;
阅读您的输入,或从getline
读取cin
。
希望它有所帮助!