控制流程C ++

时间:2017-01-31 18:42:17

标签: c++

int main()
{    
    char a[101];
    cout << "str a:";
    gets(a);
    return 0;
}

为什么gets(a);cout<<"str a:";之前执行?

编译器使用:数字火星和GNN_gcc。

3 个答案:

答案 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

希望它有所帮助!