c++11 - 字符串大小限制输入 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>
所以问题是我该如何解决这个为什么会发生这种情况?
解决方案
您的第一种方法是经过一次更正的声音-您需要使用
text = text.substr(0, 140);
而不是text = text.substr(1, 140);
. C/C++ 中的容器(包括字符串)从索引 0 开始,并且您请求从位置 1 修剪字符串。这很好,但如果字符串恰好只有一个字符长,调用text.substr(1, 140);
不一定会导致程序崩溃,但也不会以所需的输出结束。
根据此来源,substr
如果以大于字符串长度的起始位置调用,将引发超出范围的异常。如果是一个字符串,位置 1 将等于字符串长度,但返回值没有意义(事实上,它甚至可能是一个未定义的行为,但我找不到该语句的确认 - 在你和我的情况下,调用它返回一个空字符串)。我建议您在上面链接之后的交互式编码部分中自己测试它。
您的第二种方法尝试将字符串传递给需要 C 样式字符数组的函数。同样,可以在这里找到更多信息。就像错误所说的那样,编译器找不到匹配的函数,因为参数是字符串而不是 char 数组。一些函数会执行字符串到字符的转换,但这里不是这样。您可以自己将字符串转换为 char 数组,例如本文所述,但第一种方法更符合 C++ 实践。
最后一点 - 目前你只阅读一行输入,我假设你会想要改变它。
推荐阅读
- android - 如何在本机反应中的两点之间画一条线?
- c# - 嵌套字典的 Json 序列化返回 { "key": "key1", "value": "value1" }
- javascript - 为什么调用 ___grecaptcha_cfg.clients[0].callback('TOKEN'); 在 PayPal 网站上抛出未定义的错误?
- c# - 将具有科学计数法的字符串列表转换为十进制数
- .net - 无法使用 CosmosDB V3 SDK 将 cosmosdb 容器吞吐量从手动更改为自动缩放
- sql - 在标量函数中使用多个 IF
- css - 悬停在动态生成的 span 上并在 Vue 中为悬停的图标提供活动类
- parser-generator - Beaver 解析器生成器移位减少冲突连接到悬空 else
- rabbitmq - 队列中的 PCF RabbitMQ 未确认消息
- python - 如何在类python中使用函数