【问题标题】:Reading sentences as string inputs from users从用户读取句子作为字符串输入
【发布时间】:2015-06-04 08:40:34
【问题描述】:

我一直在尝试实现一个简单的代码,它将一个句子作为用户的输入,将其存储在一个字符串中并显示回来。

以下是问题: 1、当T=1时,程序立即退出。 2.当T>1时,循环只运行T-1次。

我认为使用 cin 来存储 T 的值是一个问题。由于 cin 的某些缓冲容量,输入的 T 的值是否存储为字符串?

#include <iostream>
#include <string>

int main()
{
int T;
std::cin >> T;
while (T--)
{
    std::string song;
    getline(std::cin, song);
    std::cout << song << std::endl;
}
return 0;
}

【问题讨论】:

    标签: c++ string flush


    【解决方案1】:

    如何终止变成T 的输入?用换行符。读入T 后,换行符会发生什么?它仍然留在输入缓冲区中。下次调用std::getline 时会发生什么,它将读取的第一个字符是什么?换行符,接下来会发生什么?循环迭代,然后T 为零(对于第一种情况,T 最初是1)然后循环然后程序退出。

    解决此问题的方法是使用ignore 字符直到换行符并包括换行符。

    【讨论】:

      【解决方案2】:

      在 cin 之后添加一个 getchar 作为 T 的输入留在缓冲区后的 \n。

      std::cin >> T;
      getchar();
      

      【讨论】:

        【解决方案3】:

        这是一种奇怪的方法。所以你要求用户告诉程序,在任何其他输入之前,后面会有多少行?为什么不简单:

        std::string s;
        while (getline(std::cin, s)) {
            std::cout << s << std::endl;
        }
        

        (这将简单地回显每一行(按回车键结束该行)直到文件结束(Ctrl-d)。

        无论哪种方式,您的代码的问题是while (T--):那么您为什么不尝试查看您的T 是什么,以及您的getline 在每次迭代中为您提供了什么? (我会让你自己弄清楚)。为什么不使用惯用语:

        for (int i = 0; i < T; ++i)
        

        ?

        附:如果您想阅读句子,而不是行,您可能需要考虑阅读到一个分隔符(例如.)。 getline 也会为你做到这一点:

        getline(std::cin, s, '.');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-06
          • 1970-01-01
          • 2011-06-26
          • 1970-01-01
          • 2014-03-26
          • 2018-05-20
          • 2014-02-16
          • 1970-01-01
          相关资源
          最近更新 更多