webForumDet fria alternativet

Robberlanguage

C/C++ur C/C++

8 svar · 535 visningar · startad av Caseus

Medlem sedan dec. 2005115 inlägg
Frågan#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?

Medlem sedan dec. 20025 483 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.
Medlem sedan dec. 2005115 inlägg
#3

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

Medlem sedan dec. 20025 483 inlägg
#4

text_normal :)

Medlem sedan dec. 2005115 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

Medlem sedan maj 20018 027 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.

Medlem sedan jan. 20052 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.

Medlem sedan juli 2002581 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.

Medlem sedan dec. 2005115 inlägg
#9

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

136 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)