Speicheradressen von Großbuchstaben - gelöst
-
Jetzt bekomme ich komischerweise folgende Fehlermeldung:
fatal error LNK1168: "D:\Sebastian\eigene Dokumente\Visual Studio 2010\Projects\CPP Programmierung\Debug\Eigene Übung 088 - Pointer auf Großbuchstaben.exe" kann nicht zum Schreiben geöffnet werden.Hier nochmal der ganze Code:
#include <iostream> #include <string> #include <ctype.h> #include <stdio.h> #include <locale> using namespace std; int main() { char Text[500000]=""; char *pText = &Text[500000]; char c; char *p = &c; int i=0; cout << "Geben Sie einen Text ein!\n"; gets(Text); cout << "\n"; cout << "Das haben Sie eingegeben:\n"; cout << Text; cout << "\n"; cout << "Speicheradresse des Strings: " << &Text << "\n"; cout << "\n"; while(Text[i]) { c=Text[i]; if(isupper(Text[i])); cout << reinterpret_cast<void*>(&c) << "\n"; putchar(c); i++; } cout << c << "\n"; return 0; }
-
silent_max schrieb:
Wie kann ich denn das so verändern, dass mir für das letzt n die Speicheradresse ausgelesen wird?
Die steht doch da.
Allerdings hast du
cout << reinterpret_cast<void*>(&c) << "\n"; // Adresse und Newline ausgeben putchar(c); // Zeichen ausgebenWo steht jetzt die Adresse für dein Zeichen?
Was soll eigentlich das ; in Zeile 4 ?
-
silent_max schrieb:
Jetzt bekomme ich komischerweise folgende Fehlermeldung:
fatal error LNK1168: "D:\Sebastian\eigene Dokumente\Visual Studio 2010\Projects\CPP Programmierung\Debug\Eigene Übung 088 - Pointer auf Großbuchstaben.exe" kann nicht zum Schreiben geöffnet werden.Dann beende doch erst mal den vorhergehenden Testlauf.
Der Compiler/Linker kann deine Exe nicht überschreiben, da sie noch ausgeführt wird.
-
Warum wird jetzt die Speicheradresse vom letzten Buchstaben ausgegeben, wenn ich die Speicheradresse vom ersten Buchstaben will?
-
silent_max schrieb:
Warum wird jetzt die Speicheradresse vom letzten Buchstaben ausgegeben, wenn ich die Speicheradresse vom ersten Buchstaben will?
Dann hast du das so programmiert.
Der Compiler macht das, was du schreibst und nicht das was du willst.Nochmal:
Das if in Zeile 28 hat keinen Effekt weil:DirkB schrieb:
Was soll eigentlich das ; in Zeile 4 (jetzt 28)?
-
silent_max schrieb:
Warum wird jetzt die Speicheradresse vom letzten Buchstaben ausgegeben, wenn ich die Speicheradresse vom ersten Buchstaben will?
lass mich raten: mit dem Wörtchen "Debugger" kannst du immer noch nichts anfangen?
-
Ich habe es gerade mit´m Debugger angeschaut.
Wenn ich das Wort "Hallo" eingebe, dann ist ja das "o" das letzte Zeichen, das die while-Schleife ausgibt.
Also muss ich doch die While Schleife raushauen oder wie seht ihr das?
-
Sehr schlaue Idee ihm einzutrichtern so ein dummes char array anstatt std::string zu verwenden .... nicht.
std::strings iterierst du am allereinfachsten so:
std::string s = "HansWurst"; for(std::size_t i = 0; i < s.length(); ++i) { char& c = s[i]; .... }
-
Dabei braucht man nicht einmal eine while Schleife.
Siehe hier:
#include <iostream> #include <string> #include <ctype.h> #include <stdio.h> #include <locale> using namespace std; int main() { char Text[20]=""; char *pText = &Text[20]; char c; char *p = &c; int i=0; cout << "Geben Sie einen Text ein!\n"; gets(Text); cout << "\n"; cout << "Das haben Sie eingegeben:\n"; cout << Text; cout << "\n"; cout << "Speicheradresse des Strings: " << &Text << "\n"; cout << "\n"; c=Text[i]; if(isupper(Text[i])) { cout << "Erstes Zeichen von Hallo ist ein Grossbuchstabe\n"; cout << "Speicheradresse des ersten Buchstaben:" << reinterpret_cast<void*>(&c) << c << "\n"; } return 0; }
-
Wenn dich nur das erste Zeichen interessiert brauchst du keine Schleife.
Ansonsten brauchst du eine Schleife um den String zu iterieren und jedes Zeichen einzeln anzusehen, wie zb in meinem Post skizziert.
-
silent_max schrieb:
Ich habe folgende Aufgabe zu lösen:
Schreiben Sie folgendes Programm so um, dass die Speicheradresse des Textes und die Speicheradresse der jeweiligen Grossbuchstaben ausgegeben wird.
Das ist echt nicht schön fomuliert. Großbuchstaben haben keine Adressen. Die Speicherstellen, in denen du z.B. Großbuchstaben in Form von char-Werten ablegen kannst, haben Adressen.
silent_max schrieb:
Siehe hier:
#include <iostream> #include <string> #include <ctype.h> #include <stdio.h> #include <locale> using namespace std; int main() { char Text[20]=""; char *pText = &Text[20]; char c; char *p = &c; int i=0; cout << "Geben Sie einen Text ein!\n"; gets(Text); cout << "\n"; cout << "Das haben Sie eingegeben:\n"; cout << Text; cout << "\n"; cout << "Speicheradresse des Strings: " << &Text << "\n"; cout << "\n"; c=Text[i]; if(isupper(Text[i])) { cout << "Erstes Zeichen von Hallo ist ein Grossbuchstabe\n"; cout << "Speicheradresse des ersten Buchstaben:" << reinterpret_cast<void*>(&c) << c << "\n"; } return 0; }Ich hoffe du weißt, dass gets so in Verbindung mit char-Arrays unsicher ist. Unsicher in dem Sinne, dass der Benutzer eine längere Zeichenkette eingeben kann und damit über das Ende des char-Arrays hinausgeschrieben werden kann. Das nennt man Buffer Overflow und so etwas darf einfach nicht sein, in einem Programm. Ob es nur eine kleine Übung oder ein "ernstes" Programm ist. Das hat einfach in keinem Programm etwas zu suchen, egal wie klein; denn so lernst du es ja nicht richtig.
Warum verwendest du nicht std::string für Text? Dann hast du das Buffer Overflow Problem nämlich nicht mehr.
Was ist der Sinn von pText? Das verwendest Du ja nirgens.
du gibts hier die Adresse von c aus, keine Adresse eines Elements des "Strings". Ich glaube nicht, dass das Sinn der Sache ist.
-
Auch falsch.
Du gibst du die Adresse der Variablen c aus. Und die liegt nicht innerhalb von Text.Du brauchst die Schleife.
Denn es sollen ja die Adressen (der Speicherstellen
) von allen Großbuchstaben ausgegeben werden.
Und wenn du jetzt "van Andern" eingibst, ......Weißt du jetzt wofür du das Semikolon da eingbaut hast?
Nein? Dann lass es doch mal weg.