Дублирующиеся символы в строке - PullRequest
1 голос
/ 04 февраля 2020

Empty функция возвращает функцию, является ли строка пустой или нет. Я делал подобное в своей программе.

Я писал программу, в которой нужно удалить два похожих символа. Это мой код: -

#include<iostream>
using namespace std;
int main()
{
    string str;
    cout<<"enter a name";
    getline(cin,str);
    for(int i=0;i<str.size();i++)
    {
        int x=i;
        for(int j=i+1;j<str.size();j++)
        {
        if(str[x]==str[j])
        {

            str[x]='\0';
            str[j]='\0';

        }
        else
        {
            continue;
        }
        }
    }
    if(str.empty())
    {
        cout<<"Empty";
    }
    else
    {
        cout<<str;
    }

}

Но когда строка пуста, вывод должен показать EMPTY на экране.

Это не происходит, так как if l oop не запущен.

Я думаю, что может быть одна из ошибок: -

  • Либо строка содержит нулевой символ, поэтому str.empty() не работает
  • Либо есть проблема с if

PS - Предложение будет высоко оценено.

1 Ответ

3 голосов
/ 04 февраля 2020

Тот факт, что вы установили все символы в std::string на нулевой терминатор, не делает его empty(). Он по-прежнему имеет ту же длину, что и раньше, только другой контент. std::string имеет встроенный механизм для обработки длины строки, поэтому он не должен полагаться на специальные символы, такие как строки C.

Есть несколько выходов, самым простым будет использовать идиому erase-remove и удалить все нулевые символы из строки после l oop:

#include <algorithm>

str.erase(std::remove(str.begin(), str.end(), '\0'), str.end());
//str now doesn't contain any \0 characters

Это решение лучше, потому что вы можете тогда используйте str правильно - это действительно строка с удалением всех похожих символов.


Вы также можете использовать функции для обработки C -строк, которые останавливаются на первом нулевом терминаторе, поэтому вместо этого из str.empty() вы проверяете

#include <cstring>

strlen(str.c_str()) == 0
//length of 0 means str has \0 at first place

Недостатком является то, что вы не знаете, все ли символы \0. Вы только проверяете, является ли первый из них нулевым терминатором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...