• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

funkcja replace w VS2012

Object Storage Arubacloud
0 głosów
498 wizyt
pytanie zadane 28 maja 2016 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)

Hej!

Jak zamienić jakąś część zmiennej na inną ?

Chciałem z pewnej zmiennej wszystkie wystąpienia "+-" zamienić na "-" wyczytałem że dla zmiennej result powinno być to tak:

result.replace(0,result.lenght-1,"+-","-");

Niestety gdy zaczynam pisać samo result to VS się burzy, a replace nawet nie kojaży. Jakaś biblioteka potrzebna czy przestrzeń nazw ?

Mam biblioteki iostream, string oraz przestrzenie nazw m.in. std oraz system.

Dodam na koniec że całość piszę w onclicu jednego z przycisków, a zmienna result jest stringiem i jej deklaracja znajduje się po za metodą.

Pozdrawiam Shiro!

2 odpowiedzi

0 głosów
odpowiedź 28 maja 2016 przez niezalogowany
Kod pokaż.
0 głosów
odpowiedź 28 maja 2016 przez Bondrusiek Maniak (61,370 p.)

Witam,

tu masz implementacje funkcji replace.[ C++14 ]

string (1)
string& replace (size_t pos,        size_t len,        const string& str);
string& replace (const_iterator i1, const_iterator i2, const string& str);
substring (2)
string& replace (size_t pos,        size_t len,        const string& str,
                 size_t subpos, size_t sublen = npos);
c-string (3)
string& replace (size_t pos,        size_t len,        const char* s);
string& replace (const_iterator i1, const_iterator i2, const char* s);
buffer (4)
string& replace (size_t pos,        size_t len,        const char* s, size_t n);
string& replace (const_iterator i1, const_iterator i2, const char* s, size_t n);
fill (5)
string& replace (size_t pos,        size_t len,        size_t n, char c);
string& replace (const_iterator i1, const_iterator i2, size_t n, char c);
range (6)
template <class InputIterator>
  string& replace (const_iterator i1, const_iterator i2,
                   InputIterator first, InputIterator last);
initializer list (7)
string& replace (const_iterator i1, const_iterator i2, initializer_list<char> il);

Jak widzisz nie ma w niej Twojej implementacji. Funkcja replace nie działa tak samo jak Ctrl+h. Bardziej przypomina to zaznaczenie jakiegoś tekstu(które współrzędne podajesz) i Ctrl+v. Sądząc po Twoim problemie powinieneś użyć pętli.

Przykładowy program:

#include <iostream>
using namespace std;
int main()
{
    string lancuch("+_+_+_");
    cout << lancuch << endl;
    int pos = 0;
    for(int k = 1 ; k<= 3 ; k++)
    {
        lancuch.replace(pos,2,"+");
        pos+=2;
    }
    cout << lancuch << endl;
    return 0;
}


 

komentarz 28 maja 2016 przez Shiro Stary wyjadacz (10,300 p.)
Hmm teraz zgłupiałem. To co robi funkcja replace ? Jeżeli nie zamienia to czy jest funkcja która sprawdza czy dany ciąg znaków istnieje w zmiennej i jeśli tak to go zamienia?
1
komentarz 28 maja 2016 przez Bondrusiek Maniak (61,370 p.)
Nie do końca. Spróbuje Ci to wytłumaczyć.

string wyraz = "Przemyslaw";

wyraz.replace(0,wyraz.length(),"Przemek");

Teraz wyraz równa się Przemek. Drugi przykład.

string wyraz = "Przemyslaw Przemyslaw Przemyslaw";

wyraz.replace(0,wyraz.length(),"Przemek");

Teraz wyraz znów równa się Przemek. Czyli funkcja replace wygląda tak : replace(początek_zmieniania, koniec_zmieniana, co_w_zamian);

Aby zamienić wszystkie podciągi w stringu musisz stworzyć jakiś bardziej rozbudowany algorytm.
komentarz 28 maja 2016 przez Shiro Stary wyjadacz (10,300 p.)

Udało mi się wykombinować coś takiego: 

string replce_me(string word, string find, string replace)
{
	int first;
	
    for(int i=0; i<word.length(); i++)//petla word
    {
        if(word[i] == find[0])//word[i] = find[0]
        {
        	first = i;
            int k = i + 1; // co to za zmienna k tzn do czego ona służy ?
            for(int j=1; j<find.length(); j++, k++) //pętla wewnatrz word[i] przez kolejne znaki find
            {
                if(word[k] != find[j])
                {
                    break;
                }//if
                else if(word[k] == find[j] && j == find.length()-1);
                {
                	word = word.replace(first, j, replace);//dlaczego niby zamienia tylko jeden znk czy to oznacza ze j = i i jesli tak to dlaczego ?
                	break;
                }//esle
            }//for
        }//if
    }//for
    return word;
}//fun

Dla:

cout << "ostroznosc ==> " << replce_me("ostroznosc", "osc", "OSC");

Otrzymuję: ostroznosc ==> OSCstroznOSCsc

Dlaczego zamienia tylko pierwszą literę i dlaczego uznaje ost = osc ?? 

komentarz 29 maja 2016 przez Bondrusiek Maniak (61,370 p.)

Cześć,

W sumie musisz w ten sposób to zrobić algorytmem.(ale ten algorytm jest do chrzanu).

  • if(word[i] == find[0])//word[i] = find[0]

Tu już pierwszy wada. Ta instrukcja porównuje tylko word[i] z pierwszym elementem find czyli jak masz "ostroznosc", "osc". To już porównuje od pierwszego elementu.

  •  int k = i + 1; // co to za zmienna k tzn do czego ona służy ?

Ustawia offset podciągu string (w tym przypadku word).

  •  word = word.replace(first, j, replace);//dlaczego niby zamienia tylko jeden znk czy to oznacza ze j = i i jesli tak to dlaczego ?

Tu chyba jest błąd bo j powinno się naliczać od zera.

Podsumowując ten program to taki nierozwinięta metoda replace(), którą użyłeś w pierwszym poście. Na Twoim miejscu rozwiązałbym to tak:

*jest funkcja replace(pos,ile, co)

Na początku pętla, która znajduje pozycje tego co trzeba zmienić.

Jeśli to istnieje to funkcja replace()

Znów pętla,  która znajduje pozycje tego co trzeba zmienić. Jeśli nie istnieje to koniec.

Tu pomocny link: http://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Wyszukiwanie-frazy-w-tekscie/352

komentarz 29 maja 2016 przez Shiro Stary wyjadacz (10,300 p.)

No dobra postaram się to po prawić, jednak wydaje mi się że algorytm powinien działać gdyż on miał właśnie wyszukiwać. 

  • if(word[i] == find[0])

No okey tylko pierwszy znak porównuje ale jesli jest zgodnosc to jest petla ktora sprawdza czy dalej znaki rowniesz sa sobie rowne ..  

Podobne pytania

0 głosów
0 odpowiedzi 284 wizyt
pytanie zadane 15 września 2021 w Python przez Jackoza Początkujący (410 p.)
0 głosów
1 odpowiedź 218 wizyt
0 głosów
1 odpowiedź 249 wizyt
pytanie zadane 25 listopada 2016 w JavaScript przez Shiro Stary wyjadacz (10,300 p.)

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...