---
title: "Robberlanguage"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/140138-robberlanguage"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "Caseus"
published: "2006-01-01T12:12:27.000Z"
updated: "2006-01-01T18:17:39.000Z"
replies: 8
views: 556
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/140138-robberlanguage"
---

# Robberlanguage

## #1 — Caseus, 2006-01-01T12:12Z

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?

Permalänk: https://www.webforum.nu/p/140138

## #2 — Peter S, 2006-01-01T12:18Z

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

Permalänk: https://www.webforum.nu/p/1737502

## #3 — Caseus, 2006-01-01T12:32Z

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

Permalänk: https://www.webforum.nu/p/1737504

## #4 — Peter S, 2006-01-01T12:32Z

text_normal  *:)*

Permalänk: https://www.webforum.nu/p/1737505

## #5 — Caseus, 2006-01-01T12:41Z

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

Permalänk: https://www.webforum.nu/p/1737506

## #6 — UlfT, 2006-01-01T15:23Z

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.

Permalänk: https://www.webforum.nu/p/1737543

## #7 — tobbi71, 2006-01-01T15:47Z

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.

Permalänk: https://www.webforum.nu/p/1737547

## #8 — Sang-drax, 2006-01-01T15:56Z

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.

Permalänk: https://www.webforum.nu/p/1737552

## #9 — Caseus, 2006-01-01T18:17Z

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

Permalänk: https://www.webforum.nu/p/1737597

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/140138-robberlanguage
