【问题标题】:Having issues with basic a basic string operation [c++, visual studio 2013]基本字符串操作存在问题 [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('/') 是一种非常笨拙的方法。实际上,您只需要检查一个字符,即您将要复制的字符。
  • 我得到了与之前完全相同的错误消息“字符串下标超出范围”

标签: c++ string substring


【解决方案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;
    }
    

    注意:

    1. 要使用迭代器,类必须正确实现* (unary operator), !=, ++, begin(), end() 运算符。
    2. 为了更一致的用法,可以使用const iterator

    【讨论】:

    • 感谢您的详细回答,尽管我并没有完全理解它:D,反正我的问题现在已经解决了。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多