Forum » Programiranje » [c++]Obračanje string
[c++]Obračanje string
killa bee ::
zakaj mi javi napako pri obračanju stringa.
koda:
[String subscript out of range]
koda:
#include <iostream> using namespace std; int main(){ string reverseAlp; string alph = "abcdefghijklmnopqrstuvwxyz"; int i = 0; for (string::reverse_iterator rit = alph.rbegin(); rit != alph.rend(); ++rit){ //cout << *rit; reverseAlp[i] = *rit; i++; } cin.clear(); cin.ignore(1000, '\n'); cout << "Press any key to continue..."; cin.get(); return 0; }
- spremenilo: killa bee ()
lebdim ::
pri izpisovanju stringa od zadaj, postavi števec na zadnje mesto v besedi (torej na zadnjo črko) in izpisuj nazaj do prve.
Randomness ::
Moj prvi odgovor je bil mišljen kot hint, pa je očitno napeljava malo predolga ... Torej, zapisuješ v string, katerega dolžina je enaka 0. Stringu bo potrebno prej nastaviti velikost ali pa namesto operatorja [] klicati metodo push_back.
minusnič ::
Lahko reverse konstruiraš z (alph.rbegin (), alph.rend ()) ali uporabiš string::reserve (alph.size ()) in nato zamenjaš, ampak vse to je brezveze, saj iz reverse ničesar ne izpišeš ali kako drugače uporabiš. Pa še iteratorje pa operator[] mešaš.
killa bee ::
@Randomness
Zakj pa potem to kodo uspešno izvede
Zakj pa potem to kodo uspešno izvede
string::reverse_iterator rit = alph.rbegin(); reverseAlp[0] = *rit; reverseAlp[1] = *rit-1; reverseAlp[2] = *rit-2; cout << reverseAlp[0] << " "<< reverseAlp[1] << " " <<reverseAlp[2] << endl;
galu ::
Namesto
Daj
Pa seveda tudi v glavo:
Lahko pa bi tudi
kot je predlagal Randomness... Če se ne motim, se back_inserter itak zanaša na push_back metodo.
reverseAlp[i] = *rit;
Daj
back_inserter(reverseAlp) = *rit;
Pa seveda tudi v glavo:
#include <iterator>
Lahko pa bi tudi
reverseAlp.push_back(*rit);
kot je predlagal Randomness... Če se ne motim, se back_inserter itak zanaša na push_back metodo.
Tako to gre.
Zgodovina sprememb…
- spremenil: galu ()
Randomness ::
Zakj pa potem to kodo uspešno izvedeČe postrežem z analogijo. Pri ruski ruleti imaš tudi lahko srečo in preživiš.
mallard ::
Zato, ker z operatorjem [] ne moreš dostopat do zankov, ki jih ni:
Znaka z indeksom 0 (ali katerikolim drugim indeksom) NI. Ne obstaja. V C++ je možno pisat traparije brez da bi prevajalnik bevskal nad programerjem. Standard eksplicitno navaja, da operator[] ne dela bounds checkinga, ampak se zanaša na programerja, da ne bo dostopal do neveljavnih indeksov. Če se tega ne držiš, imaš "undefined behaviour" in nosiš posledice.
string s; // string je prazen s[0] = 'a'; // WOOT?!
Znaka z indeksom 0 (ali katerikolim drugim indeksom) NI. Ne obstaja. V C++ je možno pisat traparije brez da bi prevajalnik bevskal nad programerjem. Standard eksplicitno navaja, da operator[] ne dela bounds checkinga, ampak se zanaša na programerja, da ne bo dostopal do neveljavnih indeksov. Če se tega ne držiš, imaš "undefined behaviour" in nosiš posledice.
killa bee ::
zakaj sem pa lahko potem to kodo izvedel? Pa sem lahko nastavljal v znake z indexom 0,1,2 ki jih naj nebi bilo?
string::reverse_iterator rit = alph.rbegin(); reverseAlp[0] = *rit; reverseAlp[1] = *rit-1; reverseAlp[2] = *rit-2; cout << reverseAlp[0] << " "<< reverseAlp[1] << " " <<reverseAlp[2] << endl;
mn ::
zakaj sem pa lahko potem to kodo izvedel? Pa sem lahko nastavljal v znake z indexom 0,1,2 ki jih naj nebi bilo?
Pisal si po pomnilniku ki ni bil tvoj. Včasih uspe, včasih ne. Preberi si o Buffer_overflow
killa bee ::
Zato, ker z operatorjem [] ne moreš dostopat do zankov, ki jih ni:
string s; // string je prazen
s[0] = 'a'; // WOOT?!
Znaka z indeksom 0 (ali katerikolim drugim indeksom) NI. Ne obstaja. V C++ je možno pisat traparije brez da bi prevajalnik bevskal nad programerjem. Standard eksplicitno navaja, da operator[] ne dela bounds checkinga, ampak se zanaša na programerja, da ne bo dostopal do neveljavnih indeksov. Če se tega ne držiš, imaš "undefined behaviour" in nosiš posledice.
Meni tale program požene in prikaže
#include <iostream> using namespace std; int main(){ string reverseAlp; reverseAlp[0] = 'a'; reverseAlp[1] = 'b'; reverseAlp[2] = 'c'; cout << reverseAlp[0] << " " <<reverseAlp[1] << " " << reverseAlp[2] << endl; // output: a b c cin.clear(); cin.ignore(1000, '\n'); cout << "Press any key to continue..."; cin.get(); return 0; }
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Pomoč pri programiranju v C++Oddelek: Programiranje | 1801 (1368) | amacar |
» | java mali problem (začetnik)Oddelek: Programiranje | 2391 (2134) | ozbolt |
» | c# težava delo z niziOddelek: Programiranje | 1515 (1366) | Tutankhamun |
» | [NALOGA][Java] Branje vsebine datoteke vzvratnoOddelek: Programiranje | 1599 (1541) | SkIDiver |
» | obratno izpiši besedi - c++Oddelek: Programiranje | 1741 (1572) | losnah |