При добавлении в строку за последним символом символа '\0' программа выдаёт какой-то путь в конце строки. Вывод прилагается

При добавлении в строку за последним символом символа '\0' программа выдаёт какой-то путь в конце строки.

#include <iostream>
#include <string>
using namespace std;
int main ()
{
    string S1, S2;
    getline(cin, S1);
    int i = 0, a = 0, space = 0;
    while (S1[i] == ' ' && S1[i] != '\0')//Ïðîïóñêàåì ïðîáåëû
    {
        i++;
    }
    cout << "i1: " << i << endl;
    S1.erase(a, i);//Óäàëÿåì ïðîáåëû èç ñòðîêè
    cout << "n: " << S1 << endl;
    i = 0;
    while (S1[i] != '\0')//Óäàëåíèå ïðîáåëëîâ ìåæäó ñëîâàìè
    {
        if (S1[i] == ' ' && space == 0)
        {
            space = 1;
            i++;
            S2 += ' ';
        }
        if (S1[i] == ' ' && space == 1)
        i++;
        if (S1[i] != ' ' && space == 1)
        {
            space = 0;
            S2 += S1[i];
            i++;
        }
        if (S1[i] != ' ' && space == 0)
        {
            S2 += S1[i];
            i++;
        }
    }
    i = S2.size() - 1;
    while (S2[i] == ' ')
    {
        S2.erase(i);
        i--;
    }
    cout << "i2: " << i << endl;
    int r;
    while (S2[i] != '\0')
        {
            if (S2[i] != ' ')
            r = i;
            i++;
        }
    S2[r] = '\0';
    cout << "S2: " << S2 << endl;
    return 0;
}

Вывод прилагается введите сюда описание изображения


Ответы (1 шт):

Автор решения: Zhihar

Вы реализуете то, что называется trim - т.е. отрезаете от строки с обоих концов пробелы (ну и прочие пробельные символы, типа табуляции)

find_first_not_of - ищется первая позиция, не содержащая символы из списка find_last_not_of - ищется последняя позиция в строке, не содержащая символы из списка

Поскольку вы пишите на C++ - используйте силу C++, ведь для работы со строкой есть уже нужные функции

std::string& ltrim(std::string& str, const std::string& chars = "\t\n\v\f\r ")
{
    str.erase(0, str.find_first_not_of(chars));
    return str;
}
 
std::string& rtrim(std::string& str, const std::string& chars = "\t\n\v\f\r ")
{
    str.erase(str.find_last_not_of(chars) + 1);
    return str;
}
 
std::string& trim(std::string& str, const std::string& chars = "\t\n\v\f\r ")
{
    return ltrim(rtrim(str, chars), chars);
}

и теперь можете вызывать

const std::string new_str = trim(old_str);
→ Ссылка