Speicheradressen von Großbuchstaben - gelöst
-
Was ist denn jetzt eigentlich Sache?? Die vergangenen Tage hieß es, ich soll so viel wie möglich std::string benutzen und jetzt heißt es, dass ich char nehmen soll...
-
EinGast schrieb:
std::isupper kann nur ein Zeichen und keine Kette auswerten. Du brauchst eine Schleife, in der je Zeichen diese Funktion aufgerufen wird und wenn es ein Großbuchstabe ist, dessen Adresse ausgegeben wird.
Wie müsste denn die Schleife aussehen? Irgendwie happert es bei mir da... Weil ich muss doch isupper auf den Text bringen...
Bzw. wie meinst Du das mit der Schleife?
-
silent_max schrieb:
Was ist denn jetzt eigentlich Sache?? Die vergangenen Tage hieß es, ich soll so viel wie möglich std::string benutzen und jetzt heißt es, dass ich char nehmen soll...
schau dir erstmal den Zusammenhang von string und char an.
Was genau sollte std::isupper deiner Meinung nach zurückliefern, wenn du einen ganzen String übergibst?
-
daddy_felix schrieb:
schau dir erstmal den Zusammenhang von string und char an.
Was genau sollte std::isupper deiner Meinung nach zurückliefern, wenn du einen ganzen String übergibst?
Ich dachte mir halt, dass, wenn ich einen String übergebe, mir durch std::isupper die ganzen Großbuchstaben im Text, den ich per Konsole übergebe, zurückgibt.
Ist dies überhaupt möglich? Falls ja, wie?
-
silent_max schrieb:
Ich dachte mir halt, dass, wenn ich einen String übergebe, mir durch std::isupper die ganzen Großbuchstaben im Text, den ich per Konsole übergebe, zurückgibt.
Da brauchst du nicht denken sondern nur die Dokumentation zu isupper durchlesen. Z.B da: http://www.cplusplus.com/reference/cctype/isupper/
Aber dann müßtes du auch den Prototypen verstehen.
-
Also ich habe jetzt den Code wie folgt umgeändert:
#include <iostream> #include <string> #include <ctype.h> #include <stdio.h> using namespace std; int main() { char Text[]=""; char *pText = &Text; char c; 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(c)) c = tolower(c); putchar(c); i++; } return 0; }Trotzdem bekomme ich folgende Fehlermeldungen:
error C2440: 'Initialisierung': 'char (*)[1]' kann nicht in 'char *' konvertiert werden fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.
-
Ist der erste Code aus der Aufgabe? Das sieht nicht so aus als würdet ihr C++ machen..
-
Ja, der erste Code ist aus der Aufgabe.
Edit:
Der allererster Code, den ich gepostet habe, ist aus der Aufgabe.
-
Das ist reines C..? Ich vage mal die Aussage, dass ihr garkein C++ macht bei euch, sondern C.
-
silent_max schrieb:
Was ist denn jetzt eigentlich Sache?? Die vergangenen Tage hieß es, ich soll so viel wie möglich std::string benutzen und jetzt heißt es, dass ich char nehmen soll...
Das glaube ich nicht. Es gibt einige Unterschide zwischen
char[20],std::string,char*undchar. Tut mir leid, wir konnen dir nur Dinge sagen, das Verstehen koennen wir dir nicht abnehmen. Das musst du selbst, in erster Linie durch Denken. Aber nicht im Sinne von Ausdenken sondern von Nachdenken (schon wieder ein Unterschied). Woruber nachdenken? Ueber Dinge die da sind, z.B. ueber Typen wie int, char, float. Und wenn inisupperals Parameter eincharverlangt wird, aberstd::stringbenutzt werden soll, stellt sich die Frage: Ist einchareinstd::stringbzw. kann dieser automatisch umgewandelt werden. Die Antwort hierauf ist: Nein! Also kannisuppernicht direkt mitstd::stringbenutzt werden. Trotzdem kann dein Problem geloest werden. Wie? Frage bitte nochmal, wenn du die Grundlagen verstanden hast.PS: Ist dieser Beitrag gemein oder arrogant? Vielleicht. Aber Gemeinheiten oder Hochnaesigkeit war nicht meine Absicht.
-
Sorry, aber wir nehmen im Fach Datenverarbeitungstechnik die Programmiersprache C++ durch.
Wir hatten im ersten Jahr der Technikerschule die Programmiersprache C.
Vielleicht will der Lehrer, dass wir die Programmiersprache C nicht ganz vergessen. Ich weiß jedoch nicht genau, warum unser Lehrer uns die Aufgabe gegeben hat.
Ich versuche nur, die Aufgabe in C++ zu machen, mehr nicht.
-
knivil schrieb:
PS: Ist dieser Beitrag gemein oder arrogant? Vielleicht. Aber Gemeinheiten oder Hochnaesigkeit war nicht meine Absicht.
Ich finde Deinen Beitrag weder gemein, arrogant noch hochnäsig. Du wirst wahrscheinlich das geschrieben haben, was Du Dir gedacht hast.
Dennoch hätte ich noch eine Frage.
Ich habe folgenden Code geschrieben:
#include <iostream> #include <string> #include <local> #include <ctype.h> #include <stdio.h> 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(c)) c = tolower(c); putchar(c); i++; } cout << c << "\n"; cout << &c << "\n"; return 0; }Dabei ist mir in der Ausgabe folgendes aufgefallen:
Aus "Hallo" macht er mir "hallo" und bei der ausgabe der Speicheradresse bekomme ich nur kryptische Zeichen.Woran liegt das? Ich dachte, ich hätte das Codebeispiel von http://www.cplusplus.com/reference/cctype/isupper/ auf mein Problem richtig angewendet.
Hättet ihr vielleicht einen Tipp, wie ich die Speicheradresse der Großbuchstaben auslesen kann?
-
silent_max schrieb:
Ich weiß jedoch nicht genau, warum unser Lehrer uns die Aufgabe gegeben hat.
Da du sehr große Probleme hast die Aufgabe umzusetzen, ist sie sicher nicht verkehrt.
Fehlermeldungen haben meist auch eien Angabe über die Zeile (und manche auch Spalte), wo der Fehler auftritt. Da sollte man mal nachsehen.
Du weißt immer noch nicht was das bedeutet:
char Text[]=""; char *pText = &Text;Aber zumindest ist es Mist.
Arrays haben eine feste Länge, die ist bei dir durch den Leerstring auf 1 (eins) festgesetzt.
Der Name des Arrays steht schon für deie Anfangsadresse. Darum kommt da auch kein & mehr hin.Wo kommt das i auf einmal her?
Und was hat der Codde mit der Frage aus dem Titel zu tun?
Der gibt (wenn er läuft) den Text in Kleinbuchstaben aus.
-
DirkB schrieb:
Arrays haben eine feste Länge, die ist bei dir durch den Leerstring auf 1 (eins) festgesetzt.
Der Name des Arrays steht schon für deie Anfangsadresse. Darum kommt da auch kein & mehr hin.Warum auf 1??
Ich wollte durch
char Text[500000] = "";eigentlich bezwecken, dass man einen beliebig langen Text eingeben kann.
-
silent_max schrieb:
Aus "Hallo" macht er mir "hallo"
Joa, is ja richtig.
silent_max schrieb:
und bei der ausgabe der Speicheradresse bekomme ich nur kryptische Zeichen.
Ja, da ist der Ausgabeoperator ein bisschen doof. Weil an dieser Stelle ein char liegt, denkt er da kommt nun eine Zeichenkette. Mach mal
cout << reinterpret_cast<void*>(&c)
-
Ok, war eine zeitliche Überschneidung.
500000 ist etwas übertrieben.
Das Element mit dem Index Text[500000] existiert nicht. Also ist die Adresse davon auch nicht gültig. Aber die benutzt du ja auch nicht weiter.In Zeile 34 bekommt cout einen Zeiger auf char. Der wird als Nullterminierte Zeichenkette aufgefasst.
Ist es aber nicht, da du nur ein einzelnes Zeichen hast.
-
out schrieb:
Ja, da ist der Ausgabeoperator ein bisschen doof. Weil an dieser Stelle ein char liegt, denkt er da kommt nun eine Zeichenkette. Mach mal
cout << reinterpret_cast<void*>(&c)Jetzt gibt es nur noch einen Schönheitsfehler:
Wenn ich jetzt meinen Vornamen, Maximilian, eingebe, wird mir folgendes Ausgegeben:
004A5C2F
M004A5C2F
a004A5C2F
x004A5C2F
i004A5C2F
m004A5C2F
i004A5C2F
l004A5C2F
i004A5C2F
a004A5C2F
nWie kann ich denn das so verändern, dass mir für das letzt n die Speicheradresse ausgelesen wird?
Hier der Code, um den es geht:
while(Text[i]) { c=Text[i]; if(isupper(Text[i])); cout << reinterpret_cast<void*>(&c) << "\n"; putchar(c); i++; }
-
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.