1

有谁知道为什么在这里连续使用 cin cout 和 gets 时重新排序 C 指令?我正在使用 Dev-C++ 4.9.9.2。

#include<iostream>
using namespace std;

int main(){
    char a[10],b;
    for(;;){
        cout<<"\ncin>>b:";
        cin>>b;
        cout<<"gets(a):";
        gets(a);
        cout<<"cout<<a<<b:"<<a<<" "<<b<<"\n\n";
    }
}

我得到如下输出:

cin>>b:132
gets(a):cout<<a<<b:32 1


cin>>b:465
gets(a):cout<<a<<b:65 4


cin>>b:312242
gets(a):cout<<a<<b:12242 3


cin>>b:1
gets(a):cout<<a<<b: 1

cin>>b:

似乎 cin 的一些输入被传入了 gets.. 并且似乎指令被重新排序,如下所示:

cin>>b;
gets(a);
cout<<"gets(a):";

代替,

cin>>b;
cout<<"gets(a):";
gets(a);
4

4 回答 4

2

cin>>b 只读取一个字符,剩下的输入由以后的输入操作读取。所以gets sill有一些东西可以阅读并且不要阻塞。

首先cin >> b,没有可用的输入。您在缓冲区中输入 '132\n' (来自终端的输入通常是逐行进行的),然后从中取出 1。获取读取下一个字符 32 和终止的 \n 获取。它不需要从终端读取更多内容。

于 2011-02-24T08:48:56.613 回答
0

没有任何东西被重新订购。

只有当您按下回车键时,您的键盘输入才会发送。那个时候,已经有足够的数据来执行了cin<<b,下面cout,再去完成gets(a)

换句话说,执行cin<<b被暂停到一个字符的接收。但是在您按下“Enter”之前,该字符不会发送到程序(这是因为您的终端设置)。当您按“Enter”时,第一个字符被接收,cin<<b其余字符被缓冲。cout执行,当轮到 时gets(a),缓冲区会传递包括回车在内的剩余字符,因此gets(a)也会完成,并使用您输入的数据来完成cin<<b指令。

尝试简单地按回车键cin<<b来完成,然后您会看到cout,然后您将gets(a)等待您的输入。

于 2011-02-24T08:51:30.387 回答
0

虽然没有真正回答你的问题......

C++ 中的惯用方式是使用getline。这是历史的意外,它没有iostream直接成为接口的一部分,但它确实是用于输入的函数。

来自网站的无耻插件:

// getline with strings
#include <iostream>
#include <string>

int main () {
  std::string str;
  std::cout << "Please enter full name: ";
  getline (std::cin,str);
  std::cout << "Thank you, " << str << ".\n";
}

在这个版本中, 的主要优点getline是它会向上读取直到遇到行尾字符。

例如,您可以在接受第三个参数的重载中指定自己的一组“行尾”字符,以使其在逗号或冒号处停止。

于 2011-02-24T09:35:10.463 回答
0

代码没有重新排序,但 std::cout 被缓冲,因此字符串不会立即出现在您的显示器上。因此,gets(a) 将在输出仍在缓冲区中的情况下执行。

您可以在输出字符串后添加 <<flush 以使 cout 刷新它的缓冲区。

当您使用 std::cin 时,它知道如何告诉 std::cout 在输入开始之前刷新缓冲区,因此您不必这样做。

于 2011-02-24T18:17:29.643 回答