Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Usuwanie napisu z łańcucha znaków

Ostatnio zmodyfikowano 2017-01-29 14:10
Autor Wiadomość
MoravenTolo
Temat założony przez niniejszego użytkownika
Usuwanie napisu z łańcucha znaków
» 2017-01-28 22:13:22
Mam taki program, który usuwa jakiś jeden znak z danego tekstu, ale nie wiem jak usunąć cały napis z tekstu

C/C++
#include <iostream>
#include <string.h>

using namespace std;

void f( char t[] )
{
    int i = 0;
    while( t[ i ] != 0 && t[ i ] != 'd' )
         i++;
   
    if( t[ i ] == 'd' )
         strcpy( & t[ i ], & t[ i + 1 ] );
   
    cout << t;
}



int main()
{
    char t[ 50 ] = "jeden dwa trzy";
    cout << "wynik f: " << endl;
    f( t );
}

i tutaj usuwam literę d, a co jeśli chciałbym usunąć cały napis dwa? Nie można używać stringów.
P-157082
mokrowski
» 2017-01-29 02:16:36
Zapoznaj się z strstr().
P-157086
MoravenTolo
Temat założony przez niniejszego użytkownika
» 2017-01-29 10:52:33
Mam coś takieg. Zamienia to podany napis na pusty znak, ale jak chciałbym usunąć tylko ostatni napis "dwa" albo tylko pierwszy napis "dwa" to ma ktoś jakąś podpowiedź jak to zrobić?

C/C++
#include<iostream>
#include <string.h>

using namespace std;

void f( char * t, char * stary )
{
    const char nowy[ 1 ] = { '\0' };
    char * w = t;
    int dls = strlen( stary );
    int dln = strlen( nowy );
    while( w != '\0' )
    {
        w = strstr( t, stary );
        if( w != '\0' )
        {
            memmove( w + dln, w + dls, strlen( w + dls ) + 1 );
            memcpy( w, nowy, dln );
        }
    }
}

int main()
{
    char tekst[ 200 ] = "jeden dwa trzy dwa";
    char usun[ 20 ] = "dwa";
    cout << "Tekst przed usunieciem: " << tekst << endl;
    f( tekst, usun );
    cout << "Tekst po usunieciu " << usun << " : " << tekst << endl;
}
P-157088
mateczek
» 2017-01-29 11:35:45
skoro i tak piszesz w c++
C/C++
#include<iostream>
#include<string>

using namespace std;
int main()
{
    string napis { "ala ola ala ma tygrysa" }; // napis do obróbki
    string rem = "ala "; // fragment do usunięcia
   
    for( size_t pos = napis.find( rem ); pos != string::npos; pos = napis.find( rem ) ) {
        napis.erase( pos, rem.size() );
    }
    cout << napis << endl;
}
P-157089
mokrowski
» 2017-01-29 12:29:00
Ach te "polskie" nazwy :-/ No ale zawsze lepsze niż pojedyncze literki.
C/C++
#include <iostream>
#include <cstring> // W C++ nie wczytuj nagłówków *.h jeśli są <cCOŚTAM_Z_C>

using namespace std;

// Usuwa wyrazy występujące w pierwotnym tekście.
void usun_wyraz( char * tekst, char * do_usuniecia ) {
    char * cel_ptr;
    while( NULL !=( cel_ptr = strstr( tekst, do_usuniecia ) ) ) {
        size_t dlugosc_ogona = strlen( tekst ) -(( cel_ptr - tekst ) + strlen( do_usuniecia ) );
        memmove( cel_ptr, cel_ptr + strlen( do_usuniecia ), dlugosc_ogona + 1 );
    }
}

int main()
{
    // Po co indeksy w tablicach? Sam policzy.
    char tekst[] = "morderczy pomidor morderczy kalafior";
    char usun[] = "morderczy ";
    cout << "Tekst przed usunieciem: " << tekst << endl;
    usun_wyraz( tekst, usun );
    cout << "Tekst po usunieciu: " << tekst << endl;
}
P-157091
MoravenTolo
Temat założony przez niniejszego użytkownika
» 2017-01-29 13:52:32
a co jeśli chciałbym usunąć tylko pierwszy lub ostatni wyraz, a reszta zostaje.
P-157094
mokrowski
» 2017-01-29 14:10:17
1. Jeśli chcesz usunąć tylko pierwsze wystąpienie (od lewej), to usuniesz pętlę while, dodasz if ze sprawdzeniem czy znalazł i .. usuniesz tak jak jest w podanym przykładzie.
2. Jeśli chcesz usunąć ostatnie wystąpienie (pierwsze od prawej) to masz 2 wyjścia:
 - używasz strstr() i szukasz ostatniego wystąpienia od lewej - wada: przy dłuuugich stringach mało wydajne, zaleta: już dostępne w bibliotece
 - szukasz wystąpienia od ostatniego znaku - wada: trzeba samodzielnie napisać, zaleta: wydajne przy dłuuugich stringach.

Chociaż jest taka biblioteka sstrings która obsługuje bezpiecznie operacje na stringach. Ma ona także wywołanie strrstr() czyli szukanie "od prawej".
P-157096
« 1 »
  Strona 1 z 1