基本字符串操作存在问题 [c++, visual studio 2013]
Posted
技术标签:
【中文标题】基本字符串操作存在问题 [c++, visual studio 2013]【英文标题】:Having issues with basic a basic string operation [c++, visual studio 2013] 【发布时间】:2018-01-15 20:37:54 【问题描述】:[已解决] 我正在从存储加扰的无线电消息的 .txt 文件中逐行读取,但这并不重要。其中一行称为“it”,其中一些开头字符是数字,数字后跟一个“/”。我正在尝试将这些前几个数字导出到一个字符串(称为“s1”)中,以便以后可以将其用作单个整数,这是应该执行此操作的代码:
for (i = 0; i < it.find('/'); i++)
s1[i] = it[i];
cout << s1;
但我收到一个字符串下标范围错误消息,我搞砸了什么?
编辑
问题现已解决,感谢您帮助绝对新手 :D 我的错误是不知道字符串是如何工作的,对于了解该问题的人的实际答案,请找到 Ben Voigt 的回复。正确代码为:s1+= it[i];
【问题讨论】:
您不能使用[]
(下标)更改字符串的长度。您只能访问其现有长度内的字符。要添加到最后,请使用会更改长度的操作之一,例如 +=
、append()
或 resize()
。
尝试了完全相同的方法,但使用 += 无济于事。
s1 += it[i];
应该可以正常工作,你遇到了什么错误?
另外,在循环的每次迭代中运行find('/')
是一种非常笨拙的方法。实际上,您只需要检查一个字符,即您将要复制的字符。
我得到了与之前完全相同的错误消息“字符串下标超出范围”
【参考方案1】:
您很可能试图在为s1
分配的内存之外进行分配。
假设它和s1是std::string
:
for (auto c : it)
if (c == '/')
break;
s1 += c;
cout << s1;
【讨论】:
【参考方案2】:我假设您最初拥有的行是 std::string
类型。
错误消息“下标超出范围”基本上告诉您试图访问数组的无效位置,在您的情况下是一个字符串。当括号 [ ]
之间的数字超出容器范围时,通常会发生这种情况。
避免此类错误的一种方法是使用iterator。通过使用迭代器,你可以遍历整个容器,而无需手动调用operator[]
。
考虑以下代码的简单想法,这会将/
之前的部分与原始字符串分开并将其保存到新变量中:
#include <iostream>
#include <string>
int main()
std::string s = "42/fortytwo";
std::string result = "";
for (std::string::iterator it=s.begin(); it!=s.end(); ++it)
if (*it == '/') break;
result += *it;
std::cout << result;
return 0;
注意:
-
要使用迭代器,类必须正确实现
* (unary operator), !=, ++, begin(), end()
运算符。
为了更一致的用法,可以使用const iterator。
【讨论】:
感谢您的详细回答,尽管我并没有完全理解它:D,反正我的问题现在已经解决了。以上是关于基本字符串操作存在问题 [c++, visual studio 2013]的主要内容,如果未能解决你的问题,请参考以下文章
Mysql基本操作C++Mysql简单应用PythonMysql简单应用
win10 64位 python3.6 django1.11 MysqlDB No module named 'MySQLdb' 安装MysqlDB报错 Microsoft Visua