» »

[c++]Obračanje string

[c++]Obračanje string

killa bee ::

zakaj mi javi napako pri obračanju stringa.
[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 ()

Randomness ::

reverseAlp.length() == 0

killa bee ::

kaj??

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
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
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š.

killa bee ::

@galu
to mi sedaj deluje, ampak mi ni jasno zakaj moja koda ni delovala

mallard ::

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.

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 ::

killa bee je izjavil:

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 ::

mallard je izjavil:

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;

}

Senitel ::

In kaj potem, če ti ta program požene?

ERGY ::

std::reverse(str.begin(), str.end());


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Pomoč pri programiranju v C++

Oddelek: Programiranje
141812 (1379) amacar
»

java mali problem (začetnik)

Oddelek: Programiranje
192411 (2154) ozbolt
»

c# težava delo z nizi

Oddelek: Programiranje
131526 (1377) Tutankhamun
»

[NALOGA][Java] Branje vsebine datoteke vzvratno

Oddelek: Programiranje
71611 (1553) SkIDiver
»

obratno izpiši besedi - c++

Oddelek: Programiranje
131753 (1584) losnah

Več podobnih tem