首页 > 解决方案 > 如何删除字符串中的所有空格并将数据存储在两者之间?

问题描述

我是一名新程序员(< 1 年),所以如果我将简单的事情复杂化,请原谅。

我正在尝试删除给定字符串中的所有空格(制表符和空格字符),并将数据作为单个元素存储在向量中。我还想考虑前导和尾随空格。

我尝试使用字符串方法在字符串中向前移动两个索引,同时检查这些字符。到目前为止,我至少重写了五次代码,我总是得到:

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::at: __n (which is 7754) >= this->size() (which is 42)
Aborted (core dumped)
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void  makeTokens(string& separate);

int main()
{
    string test = "  u       65.45\t\t   36.12\t     78.25  0.00";

    makeTokens(test);

    return 0;
}

void  makeTokens(string& separate)
{
    vector<string> tokens;
    unsigned short index1, index2 = 0;

    while (separate.at(index1) == ' ' || separate.at(index1) == '\t')
    {
        index1++;
        index2 = index1 + 1;
    }

    while (index2 < separate.length())
    {
        if (separate.at(index2) == ' ' || separate.at(index2) == '\t')
        {
            tokens.push_back(separate.substr(index1, index2 - index1));

            index1 = index2;

            while (separate.at(index1) == ' ' || separate.at(index1) == '\t')
            {
                index1++;
            }

            index2 = index1 + 1;
        }
        else
        {
            index2++;
        }

        if (index2 == separate.length() - 1)
        {
            if (separate.at(index2) == ' ' || separate.at(index2) == '\t')
            {
                tokens.push_back(separate.substr(index1));
            }
        }
    }

    for (unsigned short i = 0; i < tokens.size(); i++)
    {
        cout << tokens[i] << "|" << endl;
    }
}

我希望控制台输出:

u|
65.45|
36.12|
78.25|
0.00|

如果通过了类似的测试字符串,除了末尾有空格,我仍然想要相同的输出。

编辑:我已将索引声明更改为:

unsigned short index1 = 0;
unsigned short index2 = 0;

现在控制台输出:

u|
65.45|
36.12|
78.25|

最后的 0.00 仍然缺失。

标签: c++

解决方案


未定义行为的第一个实例在这里:

    unsigned short index1, ...

    while (separate.at(index1) ...
//                     ^^^^^^

index1未初始化。


推荐阅读