基本字符串操作存在问题 [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简单应用

C 忽略增量

文件的基本操作

MySQL基本语句

visua studio 自定义路径宏

win10 64位 python3.6 django1.11 MysqlDB No module named 'MySQLdb' 安装MysqlDB报错 Microsoft Visua