String in einzelne Zeichen zerlegen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
L@w
Beiträge: 916
Registriert: 24.07.2002 08:12:30

String in einzelne Zeichen zerlegen

Beitrag von L@w » 28.05.2004 10:29:50

hallo,

ich habe einen String (in c++) den ich in die einzelnen Zeichen zerlegen will.

geht das? und wie ?

so etwas meine ich :wink: aber irgendwie funktioniert da bei mir etwas nicht :cry:

Die Übung:

Definieren Sie einen char-Zeiger und eine long-Variable. Die long-Variable ist mit dem Hex-Wert 0x12345678L zu initialisieren.

Stellen Sie dann die Ausgabe auf Hex um. Zusätzlich soll bei allen nachfolgenden Ausgaben die eingestellte Zahlenbasis mit ausgegeben werden (cout-Flags!).

Geben Sie zunächst den Inhalt der long Variablen aus. Anschließend ist der Inhalt der long Variable in Byte-Darstellung auszugeben, so wie unten angegeben.
Hinweis: Verwenden Sie dazu den char-Zeiger. Die unten stehende Ausgabe gilt nur bei Prozessoren, bei denen das Low-Byte auch auf der niederen Adresse liegt. Bei anderen Prozessoren erhalten Sie eine umgekehrte Ausgabe.

Zum Schluss ist der char-Zeiger auf die Adresse des String-Literal "ABCD" zu setzen. Der String ist dann mithilfe des char-Zeigers in einzelne Buchstaben zu zerlegen und auszugeben (siehe Programmausgabe unten).
Die Programmausgabe:

0x12345678 liegt wie folgt im Speicher:
0x78,0x56,0x34,0x12
String ist: ABCD
In Buchstaben: A,B,C,D
cu L@w
---

LINUX - because booting is for adding hardware!

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 28.05.2004 12:39:33

Das setzen der cout-flags überlasse ich jetzt mal dir.

Code: Alles auswählen

 // p ist char*, l der long
for(i=0,p=(char*)&l ;i < sizeof(long) ; i++,p++)  std::cout << *p << " ";
Theoretisch müsstest du "i < sizeof(long)/sizeof(char)" schreiben, aber in der realität ist jeder Char auch genau 8 Bit. (Zumindest ANSI C sagt, dass ein char mindestens 8 bit haben muss)

Benutzeravatar
L@w
Beiträge: 916
Registriert: 24.07.2002 08:12:30

Beitrag von L@w » 31.05.2004 22:14:53

irgendwie komm ich da noch immer nicht ganz mit (bin halt noch ein c++ newbie)

kannst du mir das noch ein bisschen genauer beschreiben?
cu L@w
---

LINUX - because booting is for adding hardware!

Benutzeravatar
L@w
Beiträge: 916
Registriert: 24.07.2002 08:12:30

Beitrag von L@w » 01.06.2004 10:50:52

hallo,

hier mal mein programm

Code: Alles auswählen

#include<iostream>                                                                                                                                                                   
                                                                                                                                                                   
int main (void)
{
                                                                                                                                                                   
  // p ist char*, l der long                                                                                                                                                                   
  char* p;
  long l;
  int i;
                                                                                                                                                                   
  for(i=0,p=(char*)&l ;i < sizeof(long) ; i++,p++)  std::cout << *p << " \n ";                                                                                                                                                                   
  return 0;
                                                                                                                                                                   
}
aber das funktioniert irgendwie überhaupt nicht :cry:
cu L@w
---

LINUX - because booting is for adding hardware!

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 01.06.2004 14:18:44

Ja, ich hatte den Typcast auf int beim *p vergessen. Hier mal das ganze Programm:

Code: Alles auswählen

#include<iostream>
using namespace std;

int main() /* funktion() ist in C++ identisch mit funktion(void) */
{

   char* p;
   long l=0x12345678L;
   int i;
   
   cout << showbase << hex;
   cout << "Der Wert " << l << " liegt wie folgt im Speicher:";
   
   for(i=0,p=(char*)&l ;i < sizeof(long) ; i++,p++)  cout << (int)(*p) << " ";
   cout << endl;

   // "ABCD" erzeugt einen Null-terminierten String "ABCD" im Speicher
   // und steht fr den Pointer auf den ersten Buchstaben
   // Im Gegensatz zu C werden bei C++ für identische Strings neue 
   // erzeugt. (Nach a = "ABCD" und b="ABCD" zeigen a und b auf andere Adressen)
   p = "ABCD";
   cout << "Der String "<< p << " ist buchstabenweise:";
   for( ; *p ; p++) cout << *p << " " ;
   cout << endl;
   
   return 0;
} 
Hoffe, das hilft dir, den Einstieg in C++ zu finden; weitere Aufgaben dieser Art solltest du jetzt lösen können.

Edit: Statt

Code: Alles auswählen

 (int)(*p)
schreibt man neuerdings

Code: Alles auswählen

static_cast<int>(*p)
BTW: Falls du an einer Uni bist, solltest du mal schauen, ob es bei euch das Skript "C++ für C-Programmierer" vom RRZN gibt. Das ist zwar schon etwas veraltet, ist aber eine recht gute Einführung

Benutzeravatar
L@w
Beiträge: 916
Registriert: 24.07.2002 08:12:30

Beitrag von L@w » 01.06.2004 16:38:19

vielen dank,

das hat mich wirlich um einiges weitergebracht. werde mich mal wegen dem skript erkundigen.

danke nochmal
cu L@w
---

LINUX - because booting is for adding hardware!

Antworten