使用" string"时,C ++脚本表现不佳数据类型

时间:2017-07-06 06:17:57

标签: c++ string io

我只想写一个简单的脚本,询问别人的名字并将其打印出来。但由于某种原因,当我使用字符串数据类型时,它只是一种,什么都不做。

如果我使用字符串,这是代码和输出:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string name;

    cout << "Please give me your name: ";
    getline(cin, name);
    cout << "Hello " << name << endl;
    return 0;
}

enter image description here

正如您所看到的,它只运行.exe并且没有任何反应。但是,如果我将C方法用于字符串并使用字符数组并且也不使用getline(),它可以正常工作(但不会跳过&#39; \ 0&#39;字符):

#include <iostream>
#include <string>

using namespace std;

int main()
{
    //string name;
    char name[15];

    cout << "Please give me your name: ";
    //getline(cin, name);
    cin >> name;
    cout << "Hello " << name << endl;
    return 0;
}

enter image description here

我尝试了其他几种方法,但都运行良好。出于某种原因,将变量 name 作为字符串数据类型使其表现得非常奇怪。我试着查看一些基于C ++的书籍和网络,但似乎没有人  有这个问题。

我只是想加上这个来澄清一下,我检查一下该程序是否只是执行得太快,让我看不清楚发生了什么。它没有这样做,它甚至会跳过它应该等待输入的部分。

我使用Visual Studio Code编写程序和MinGW进行编译。我拿了我的代码并在https://www.onlinegdb.com/处运行它并按预期工作:

enter image description here

这可能是Windows或命令提示符问题吗?

1 个答案:

答案 0 :(得分:0)

根据STL实现和操作系统,std::cout可能正在缓冲内存中的数据。它通常不会将缓冲数据刷新到控制台,直到:

  • 达到阈值
  • 输出'\n'个字符
  • std::cout.flush()被调用(包括输出std::endl,在写入换行符后调用flush()

在输出提示后并在阅读std::cout.flush()之前尝试拨打std::flush(直接或通过name):

#include <iostream>
#include <string>

using namespace std;

int main() {
    string name;
    cout << "Please give me your name: " << flush;
    getline(cin, name);
    cout << "Hello " << name << endl;
    return 0;
}