Działania na String

0

Czy mogę odnieść się do indeksu stringa? Np. w pętli. W tym programie akurat chodzi o usunięcie znaku sprzed "<" .
Przykład:
Fra<nek --> Frnek

#include <iostream>

using namespace std;

int main()
{
    string napis;
    cin >> napis;
    for(int i = 0;i<napis.size();i++){
        if(napis[i] == "<"){
            napis[i] = "\b";
        }
    }
    cout << napis;

    return 0;
}
0

Hej, ale tak nic nie usuwasz, tylko wstawiasz pod indeks i jakiś znaczek (obojętne, czy to '\b' czy '*'). Ale poza tym możesz, czemu nie...?

0

Z grubsza poprawione (o ile chcesz usunąć tylko pierwszy znak oznaczony '<'):

#include <iostream>
#include <string>

int main() {
    std::string napis;
    cin >> napis;
    for(int i = 0; i < napis.size(); ++i) {
        if(napis[i] == '<') {
            napis.erase(i-1, 2);
            break;
        }
    }
    std::cout << napis << std::endl;
}
2

Wyrażenie

napis[i] == "<"

jest błędne (nie skompiluje się ), gdyż elementy std::string są znakami ( typ **char **).

Poniżej przykład z użyciem szablonu do wyboru znaku usuwania ( domyślnie jest '<'). Dodatkowo zakładam że w tekście nie będą występować wielokrotności '<' - na przykład "Fran<<<ek<<l<<<"

[C++17]

#include <iostream>

using namespace std;

template< char sign = '<' >
string remove( string_view text )
{
    string result;

    for( auto iter {cbegin(text)} ; iter!=cend(text) ; ++iter )
    {
        if( *iter == sign ){ if( !result.empty() ) result.pop_back(); }
        else result += *iter;
    }

    return result;
}

int main()
{
    cout << remove("<Fra<nek<"s);
}

https://godbolt.org/z/xEb5Mze35

0

@koszalek-opalek: do czego sie odnosi 2 w napis.erase(i-1, 2);

1
KomnatoMan napisał(a):

@koszalek-opalek: do czego sie odnosi 2 w napis.erase(i-1, 2);

Bo chcesz usunąć dwa znaki -- '<' oraz ten wcześniejszy.

5
koszalek-opalek napisał(a):

Bo chcesz usunąć dwa znaki -- '<' oraz ten wcześniejszy.

Nie sądzę, wydaje mi się że spytał w innym wątku jak usunąć znak na ekranie i dostał odpowiedź '\b' :d
Typowe XY

0
#include <iostream>
using namespace std;

int main()
{
     for(int ch;!isspace(ch=cin.get());) if(ch!='<') cout<<" \b"; else cout.put(ch);
     return 0;
}
2

@TomaszLiMoon: Dlaczego template??? W czym Twój kod będzie lepszy niż analogiczny z nagłówkiem:

string remove(string_view text, char sign='<')

?

PS. No i Twój nie usuwa, ale generuje nowy napis... Ogólnie może to i lepiej, ale nie o to było pytanie. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1