首页 > 解决方案 > 字符串大小限制输入 cin.get() 和 getline()

问题描述

在这个项目中,用户可以输入一个文本(最多 140 个字符)。所以对于这个限制,我曾经使用过getline()

  string text;
  getline(cin, text);
  text = text.substr(1, 140);

但在这种情况下,结果cout << text << endl;是一个空字符串。

所以我cin.get()像这样使用:

cin.get(text, 140);

这次我得到这个错误:没有匹配函数调用'std::basic_istream::get(std::__cxx11::string&, int)'</p>

请注意,我已包括<iostream>

所以问题是我该如何解决这个为什么会发生这种情况?

标签: c++11inputuser-inputcingetline

解决方案


您的第一种方法是经过一次更正的声音-您需要使用

text = text.substr(0, 140);

而不是text = text.substr(1, 140);. C/C++ 中的容器(包括字符串)从索引 0 开始,并且您请求从位置 1 修剪字符串。这很好,但如果字符串恰好只有一个字符长,调用text.substr(1, 140);不一定会导致程序崩溃,但也不会以所需的输出结束。

根据此来源substr如果以大于字符串长度的起始位置调用,将引发超出范围的异常。如果是一个字符串,位置 1 将等于字符串长度,但返回值没有意义(事实上,它甚至可能是一个未定义的行为,但我找不到该语句的确认 - 在你和我的情况下,调用它返回一个空字符串)。我建议您在上面链接之后的交互式编码部分中自己测试它。

您的第二种方法尝试将字符串传递给需要 C 样式字符数组的函数。同样,可以在这里找到更多信息。就像错误所说的那样,编译器找不到匹配的函数,因为参数是字符串而不是 char 数组。一些函数会执行字符串到字符的转换,但这里不是这样。您可以自己将字符串转换为 char 数组,例如本文所述,但第一种方法更符合 C++ 实践。

最后一点 - 目前你只阅读一行输入,我假设你会想要改变它。


推荐阅读