При добавлении в строку за последним символом символа '\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);
