字符串大小限制输入cin.get()和getline()

时间:2018-06-09 09:56:40

标签: c++11 input user-input cin 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&amp;,int)'

请注意,我已加入<iostream>

所以问题是如何解决这个问题为什么会发生?

1 个答案:

答案 0 :(得分:0)

你的第一种方法是通过一次修正的声音 - 你需要使用

text = text.substr(0, 140);

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

根据this source,如果调用起始位置大于字符串长度,text.substr(1, 140);将抛出超出范围的异常。如果是一个字符串,则位置1将等于字符串长度,但返回值没有意义(事实上,它甚至可能是未定义的行为,但我无法找到此声明的确认 - 在您和我的情况下,调用它返回一个空字符串)。我建议您按照上面的链接在交互式编码部分自行测试。

您的第二种方法尝试将字符串传递给期望C样式字符数组的函数。同样,可以找到更多here。就像错误说的那样,编译器找不到匹配的函数,因为参数是一个字符串而不是char数组。某些函数将执行字符串到char的转换,但这不是这种情况。您可以自己将字符串转换为char数组,例如描述in this post,但第一种方法更符合C ++实践。

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