C++ Paar Verständnisfragen

Status
Für weitere Antworten geschlossen.

Poati

Captain
Registriert
Okt. 2009
Beiträge
3.626
Hi Leute!
Ich schreibe demnächst eine Klausur in c++. Unser Prof hat uns einen Haufen an Fragen gegeben, die wir beantworten sollen könnten. Bei den beiden hier weiß ich nicht so wirklich:

1. Gegeben sei die Zeichenkette char * s = "0123". Wenn Sie das zugrundeliegende
Bitmuster im Speicher uminterpretieren lassen (z. B. mit int
i = (*((int*)s)); ), welche Werte ergeben sich für die Typen char und
int?

4. Welche Schritte sind notwendig, um zwei nullterminierte Zeichenketten an
einander zu hängen? Geben Sie mindestens zwei der möglichen Antworten.

Wäre super wenn ihr mir da helfen könntet.
 
Hilfe zu Hausaufgaben oder ähnlichen Sachen werden hier nicht gegeben, siehe Forenregeln.
An der Nummerierung sieht man ja schon, dass du nur 1 zu 1 kopiert hast ;) Selber machen lautet die Devise zum Erfolg
 
Oh ok...
Hab halt schon lange gesucht und finde dazu einfach nichts :(
Komme bei der zweiten Frage halt einfach nur auf eine Lösung. So wie es strcat(); auch machen würde.
 
@1: Was spricht denn dagegen, den Code einfach mal laufen zu lassen und sich das Ergebnis anzuschauen? :rolleyes:
 
Nichts, verstehe nur nicht ganz was mir das Ergebnis sagen soll. Also klar, für den Integer ergibt sich eine wilde Zahl. Das wird die Adresse im Speicher sein. Für den char bekomme ich eine 0
 
Poati schrieb:
Oh ok...
Hab halt schon lange gesucht und finde dazu einfach nichts :(
Komme bei der zweiten Frage halt einfach nur auf eine Lösung. So wie es strcat(); auch machen würde.


Das ist UNMÖGLICH, dass man zu den klassischsten aller Beispiele für Typumwandlung eines strings in C++ NICHTS findet. Steht in JEDEM C/C++ Tutorial im string/char Kapitel. Und wenn du weißt, was strcat macht, dann hast du ja die Antwort welche Schritte strcat durchführt.
 
Die wilde Zahl ist keine Adresse im Speicher. Guck dir den Wert mal hexadezimal an.
 
Habe ich je gesagt ich finde nichts zur Typumwandlung von char zu int? Das ist hier überhaupt nicht mein Problem. Ich bekomme als Werte 858927408 und für den char eine 0. bei der 0 weiß ich nicht weiter.
Ja die eine Antwort habe ich. Er spricht aber von MINDESTENS zwei Möglichkeiten. Weiss nicht worauf er hinaus will.
 
Nein, es gibt genau eine Möglichkeit die Frage 2 zu beantworten und Hinweise auf den Lösungsweg gab es hier auch:

Wie werden allgemein Objekte im Speicher adressiert? Wie werden also Zeichen im Speicher repräsentiert? Was ist 858927408 als Hexadezimalzahl und woher kennst du die?

Bei der anderen Frage hast du doch schon eine mögliche Antwort gefunden: Wie strcat() es macht. Also weiter: Wie macht strcat() das? Und da gibt es noch was das strcat seht ähnlich ist, und zwar...
Hinweis: *Magic* ist nicht richtig ;)
 
Zuletzt bearbeitet:
i = (*((int*)s));

Ergibt auf unterschiedlichen Architekturen unterschiedliche Ergbenisse. Stcihwort Low Endian Big Endian... Daduch ist die Antwort nicht eindeutig und es gibt zwei Lösungen.
Ergänzung ()

4. )
man sprintf
man strcat
 
Zuletzt bearbeitet:
Ergibt auf unterschiedlichen Architekturen unterschiedliche Ergbenisse. Stcihwort Low Endian Big Endian... Daduch ist die Antwort nicht eindeutig und es gibt zwei Lösungen.

Ne im Speicher steht das gleiche in umgekehrter Wagenreihung, ich würde hier nicht von zwei möglichen/unterschiedlichen Ergebnissen sprechen. Sonst müsste man auch sagen, dass gleichwertige Zahlen in verschiedenen Darstellungen unterschiedliche Zahlen sind.
 
Zuletzt bearbeitet:
Also zu 4. ich glaube kaum dass dein Prof einfach nur da zwei Funktionen genannt bekommen will...
Deswegen mal 1 Vorschlag:
eben die eine Zeichenkette durchlaufen bis man zum Nullpointer kommt, dann den Pointer vom letzten Zeichen so umbiegen dass er auf die andere Zeichenkette zeigt. Aus zwei mach eins :P
2. Vorschlag:
Einfach die Zeichen einzeln an die Zeichenkette hinten ran kopieren, wobei ich da keinen Vorteil sehe :P
 
Tipps:

zu 1.: Wie liegt die Zeichenkette im Speicher? Was passiert beim Cast?

zu 4.: Nullterminierend ist das Stichwort.
 
Das sind halt typische Erst und Zweitsemester Fragen, wenn du die dir nicht selbst erarbeitest, dann siehts Essig aus in der Klausur. Wichtig ist, dass du verstehst was genau passiert und warum. Nur so kannst dann auch ähnliche Fragen beantworten. Wir würden dir also keinen Gefallen tun dir hier die Aufgaben zu lösen
 
Ich gehe auch mal stark davon aus dass diese Dinge während des Semesters behandelt wurden und irgendwo im Skript auftauchen. Dies solltest du vielleicht nochmal durcharbeiten.

Beantworte dann die Fragen die du kannst, notier dir die Lösungen (mit Begründung) und setzt dich mit 1-3 Kommilitonen zusammen und vergleicht eure Ergebnisse. Wenn jemand etwas nicht verstanden hat können die anderen ihm das erklären.

In diesem Fall wird das denke ich der Effektivste Weg zum Lernen sein.
 
char *s="01234"; -> 0x30313233 Egal ob Big oder Little

int i=(*(int*)s);
0x33323130 ist bei Little Endian -> 858927408
0x30313233 ist bei Big Endian -> 808530483
 
Zuletzt bearbeitet:
rg88 schrieb:
Das sind halt typische Erst und Zweitsemester Fragen, wenn du die dir nicht selbst erarbeitest, dann siehts Essig aus in der Klausur. Wichtig ist, dass du verstehst was genau passiert und warum. Nur so kannst dann auch ähnliche Fragen beantworten. Wir würden dir also keinen Gefallen tun dir hier die Aufgaben zu lösen

!
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben