webForumDet fria alternativet

Robberlanguage

8 svar · 533 visningar · startad av Caseus

CaseusMedlem sedan dec. 2005105 inlägg
#1

Hej, jag tänkte skriva ett litet program som tar ett String-objekt och gör om dess innehåll så att det blir skrivet i rövarspråket istället (ni vet det där språket där man dubblar alla konsonanter och sätter in ett "o" mellan dem).

Men när jag kompilerar programmet får jag felmeddelandet:

Unhandled exception at 0x7c81eb33 in Robberlanguage.exe: Microsoft C++ exception: std::out_of_range @ 0x0012fc80.

Och sedan hamnar jag mitt i (närmare bestämt rad 605) en header (tror jag) som heter xstring, där det överst står: "// xstring internal header (from <string>)".

Här är källkoden:

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string text_normal;
	string text_robber;

	cout << "Type a text that will be turned into robberlanguage: ";
	getline(cin, text_normal);
	cout << endl;

	text_robber.reserve(text_normal.size()*3);					// Reserverar 3x mer plats utifall
											// att texten bara består av
											// konsonanter.
    for(int i=0; i < text_normal.size(); i++)
	{
		if(text_normal[i] ==	('B' || 'C' || 'D' || 'F' || 'G' || 'H' || 'J' ||	// Alfabetets konsonanter,
					'K' || 'L' || 'M' || 'N' || 'P' || 'Q' || 'R' ||	// både versaler resp. gemener.
					'S' || 'T' || 'V' || 'W' || 'X' || 'Z' || 'b' ||
					'c' || 'd' || 'f' || 'g' || 'h' || 'j' || 'k' ||
					'l' || 'm' || 'n' || 'p' || 'q' || 'r' || 's' ||
					't' || 'v' || 'w' || 'x' || 'z'
								)
			)
		{
			text_robber.append(text_normal[i] + 'o' + text_normal[i]);	// Dubblar konsonanten och sätter
		}									// ett "o" mellan dem.
		else
		{
			text_robber.append(text_normal[i]);											// Lägger till vokalen.
		}
	}

	cout << text_robber << endl;
	cin >> text_normal;
	return 0;
}

Vad har jag gjort för fel?

Peter SMedlem sedan dec. 20025 484 inlägg
#2

Det jag lägger märke till direkt är

		if(text_normal[i] ==	('B' || 'C' || 'D' || 'F' || 'G' || 'H' || 'J' ||	// Alfabetets konsonanter,
					'K' || 'L' || 'M' || 'N' || 'P' || 'Q' || 'R' ||	// både versaler resp. gemener.
					'S' || 'T' || 'V' || 'W' || 'X' || 'Z' || 'b' ||
					'c' || 'd' || 'f' || 'g' || 'h' || 'j' || 'k' ||
					'l' || 'm' || 'n' || 'p' || 'q' || 'r' || 's' ||
					't' || 'v' || 'w' || 'x' || 'z'
								)
			)

som istället bör vara

if (foo == 'A' || foo == 'B' || foo == 'C' u.s.w.
CaseusMedlem sedan dec. 2005105 inlägg
#3

Ursäkta men vad menar du med "foo"?

Peter SMedlem sedan dec. 20025 484 inlägg
#4

text_normal :)

CaseusMedlem sedan dec. 2005105 inlägg
#5

Okej, nu ändrade jag om det till:

if(text_normal[i] == 'B' || text_normal[i] == 'C' || text_normal[i] == 'D' || 
			text_normal[i] == 'F' || text_normal[i] == 'G' || text_normal[i] == 'H' || 
			text_normal[i] == 'J' || text_normal[i] == 'K' || text_normal[i] == 'L' || 
			text_normal[i] == 'M' || text_normal[i] == 'N' || text_normal[i] == 'P' || 
			text_normal[i] == 'Q' || text_normal[i] == 'R' || text_normal[i] == 'S' || 
			text_normal[i] == 'T' || text_normal[i] == 'V' || text_normal[i] == 'W' || 
			text_normal[i] == 'X' || text_normal[i] == 'Z' || text_normal[i] == 'b' ||
			text_normal[i] == 'c' || text_normal[i] == 'd' || text_normal[i] == 'f' || 
			text_normal[i] == 'g' || text_normal[i] == 'h' || text_normal[i] == 'j' || 
			text_normal[i] == 'k' || text_normal[i] == 'l' || text_normal[i] == 'm' || 
			text_normal[i] == 'n' || text_normal[i] == 'p' || text_normal[i] == 'q' || 
			text_normal[i] == 'r' || text_normal[i] == 's' || text_normal[i] == 't' || 
			text_normal[i] == 'v' || text_normal[i] == 'w' || text_normal[i] == 'x' || 
			text_normal[i] == 'z')
			)

Men det blir fortfarande samma fel. :q

UlfTMedlem sedan maj 20016 050 inlägg
#6

Det kan vara så enkelt som att cout inte får en nullterminerad sträng. Då fortsätter den att läsa från strängens minne även utanför det allokerade utrymmet. Ett sådant fel skulle faktiskt ge ett out_of_range-fel.

tobbi71Medlem sedan jan. 20057 inlägg
#7

avmarkera allt inom for-satsen
och kolla så programmet fortfarande fungerar.
for (int i... )
{
/* kommentera..

*/
}

Funkar det så är det någonstans i forsatsen du skrivit felet.

Sang-draxMedlem sedan juli 2002570 inlägg
#8

Detta är fel:

text_robber.append(text_normal[[blue][/blue]i] + 'o' + text_normal[[blue][/blue]i]);

Så går inte att skriva i C++ (lägga ihop tecken till sträng), utan du får t ex skriva:

text_robber += text_normal[[blue][/blue]i];
text_robber += 'o'.
//...

Och motsvarande i else-blocket.

UlfT skrev:

Det kan vara så enkelt som att cout inte får en nullterminerad sträng. Då fortsätter den att läsa från strängens minne även utanför det allokerade utrymmet. Ett sådant fel skulle faktiskt ge ett out_of_range-fel.

Nej. C++-stränger använder sig inte av null-terminering.

CaseusMedlem sedan dec. 2005105 inlägg
#9

Tackar, Sang-drax. :e Nu fungerar det som det ska.

Genererad på 387 ms · cache AV · v20260730165559-full.f96bc7eb