Usuwanie napisu z łańcucha znaków
Ostatnio zmodyfikowano 2017-01-29 14:10
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 #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. |
|
mokrowski |
» 2017-01-29 02:16:36 Zapoznaj się z strstr(). |
|
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ć? #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; }
|
|
mateczek |
» 2017-01-29 11:35:45 skoro i tak piszesz w c++ #include<iostream> #include<string>
using namespace std; int main() { string napis { "ala ola ala ma tygrysa" }; string rem = "ala "; for( size_t pos = napis.find( rem ); pos != string::npos; pos = napis.find( rem ) ) { napis.erase( pos, rem.size() ); } cout << napis << endl; }
|
|
mokrowski |
» 2017-01-29 12:29:00 Ach te "polskie" nazwy :-/ No ale zawsze lepsze niż pojedyncze literki. #include <iostream> #include <cstring>
using namespace std;
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() { 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; }
|
|
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. |
|
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". |
|
« 1 » |