The Pointer is pointing on you...
-
Nexus schrieb:
Du hast einen einzelnen
charund verlangst, dass der eine Zeichenkette speichern kann?Dummer Fehler, hab dann was falsch verstanden, grade im Buch nachgeschlagen:
char* a = "Hallo"; a[2] = 3;Dachte ich könnte das auch so machen, einen String will ich nicht benutzen^^ Wollte es mal ohne schaffen.

Nexus schrieb:
Bitte nächstes Mal auch noch sagen, was du erwartest und inwiefern das Programmverhalten davon abweicht, bzw. wo ein Fehler liegt.
Jap, mein Fehler. Was ich machen will. Ich will die Verschiebechiffre programmieren. Sie bekommt eine Zeichenkette, mit einer Funktion(rot3_func) soll jedes Zeichen um 3 Zeichen verschiebt werden. Und zurückgeliefert werden...
Nun weiß ich nicht wo ungefähr der Fehler ist. Beim Einlesen(70%) der Zeichenkette oder bei der Rückgabe(30%)?Lg Mentras
-
Mentras schrieb:
char* a = "Hallo";So weist du a die Adresse des Stringliterals "Hallo" zu! Das ist also nicht so ratsam, wenn du deine Zeichenkette auch ändern willst. Mach es lieber so:
char a[] = "Hallo";
-
_matze schrieb:
Mentras schrieb:
char* a = "Hallo";So weist du a die Adresse des Stringliterals "Hallo" zu! Das ist also nicht so ratsam, wenn du deine Zeichenkette auch ändern willst. Mach es lieber so:
char a[] = "Hallo";Gut, das ist aber initialisieren

Ich darf ja nicht einfach:
char a[];Da ich gelernt habe, dass ich eine Größe angeben muss...
Wenn du C-Strings ausprobieren willst, musst du auch beachten, dass das char-Arrays sind. Also musst du auch entsprechend deklarieren (z.B. "char eingabe[128];"). Wie bereits gesagt wurde, ein Zeichen (char) und eine Zeichenkette (char*, char[]) sind nicht dasselbe.
Jap, eine Möglichkeit wäre die Größe vorher zu bestimmen, aber jetzt kommen "was ist wenn"-Fragen, wenn der Benutzer 128 Zeichen eingibt...
Bin irgendwie durcheinander, dabei erschien mir die Sache so easy 
-
[offtopic]Das kommt dann davon, wenn man dem Ratschlag folgt, gleich "richtiges" C++ zu lernen, bevor man sich mit den Grundlagen bzw. C auseinandersetzt. Gefährlich, gefährlich[/offtopic]
-
Alter Zeh schrieb:
[offtopic]Das kommt dann davon, wenn man dem Ratschlag folgt, gleich "richtiges" C++ zu lernen, bevor man sich mit den Grundlagen bzw. C auseinandersetzt. Gefährlich, gefährlich[/offtopic]
Learning by doing
-
Mentras schrieb:
Nun weiß ich nicht wo ungefähr der Fehler ist. Beim Einlesen(70%) der Zeichenkette oder bei der Rückgabe(30%)?
Lg MentrasDer Fehler liegt beim Einlesen(70%) und bei der Rückgabe(30%). Macht summa summarum 100%.

Zum Einlesen nimm einen sauber initialisiertes char Array:
char buf[1024] = {0};Aus deiner Funktion mach:
void rot3_func(char* p); // Prototyp.Denn du übergibst einen Zeiger auf das Array, dessen Inhalt in der Funktion geändert wird. Darum muss nix zurückgegeben werden.
Gruß,
e.
-
das war nicht gegen dich gerichtet, mehr gegen die leute, die propagieren man sollte lieber gar nicht erst den "alten, unnötigen c mist" lernen.
-
err0r schrieb:
Mentras schrieb:
Nun weiß ich nicht wo ungefähr der Fehler ist. Beim Einlesen(70%) der Zeichenkette oder bei der Rückgabe(30%)?
Lg MentrasDer Fehler liegt beim Einlesen(70%) und bei der Rückgabe(30%). Macht summa summarum 100%.

Zum Einlesen nimm einen sauber initialisiertes char Array:
char buf[1024] = {0};Aus deiner Funktion mach:
void rot3_func(char* p); // Prototyp.Denn du übergibst einen Zeiger auf das Array, dessen Inhalt in der Funktion geändert wird. Darum muss nix zurückgegeben werden.
Gruß,
e.Ahh, das klingt logisch

Werde ich gleich mal testen.das war nicht gegen dich gerichtet, mehr gegen die leute, die propagieren man sollte lieber gar nicht erst den "alten, unnötigen c mist" lernen.
Ah ^^, C lerne ich ja indirekt durch ein Openbook C von A bis Z. Und solche C-Strings haben was, was mich anzieht x)
Lg Mentras
-
Mentras schrieb:
Ich will die Verschiebechiffre programmieren.
Code: (VORSICHT SPOILER!):
void chiffre( char *buffer, const unsigned int bufferLength ) { for( unsigned int i = 0; i < bufferLength; ++i ) buffer[i] += 3; };Sorry, aber da hatte ich jetzt Bock zu...
-
Mentras schrieb:
Jap, eine Möglichkeit wäre die Größe vorher zu bestimmen, aber jetzt kommen "was ist wenn"-Fragen, wenn der Benutzer 128 Zeichen eingibt...
Du musst aber auch beachten, dass du auch mit deiner Methode eine feste Größe vergibts (nämlich bei "Hallo" 6 Zeichen inkl. abschließender Null). Nur, dass du dabei halt ein Literal (Konstante) erzeugst und dessen Adresse a zuweist!
Mentras schrieb:
Bin irgendwie durcheinander, dabei erschien mir die Sache so easy 
Ist sie eigentlich auch. Einfach am Ball bleiben.
Es gibt auch gute Artikel hier auf c++.de. Lies dir da einfach mal ein paar Sachen durch (Pointer, Speicherverwaltung...).
-
err0r schrieb:
Denn du übergibst einen Zeiger auf das Array, dessen Inhalt in der Funktion geändert wird. Darum muss nix zurückgegeben werden.
Es sei denn, er will die Rückgabe gleich in Ausdrücken verarbeiten können. Dann könnte er schon den übergebenen Pointer noch mal zurückgeben. Obwohl ich das eigentlich nie so mache...
Alter Zeh schrieb:
das war nicht gegen dich gerichtet, mehr gegen die leute, die propagieren man sollte lieber gar nicht erst den "alten, unnötigen c mist" lernen.

-
Huch, ich hatte schon die Schnur um meinen Hals gebunden und noch zum Schluss etwas geändert und es hat geklappt...
Folgende Fragen: (Siehe Kommentare)void rot3_func(char* p) { for(int i=0;p[i]!='\0';i++) p[i]+=3; } int main() { char eingabe[1024] = {0}; std::cout << "Geben Sie den Text ein:" << std::endl; std::cin >> eingabe; rot3_func(eingabe); //Wieso darf ich nicht: rot3_func(&eingabe); schreiben? Oo for(int i=0; eingabe[i]!='\0';i++) //Kann ich es auch ohne For-Schleife ausgeben lassen? std::cout << eingabe[i]; }Danke nochmal für eure Hilfe!

-
1. Weil der Name eines Arrays ohne Operator [] schon die Adresse (des ersten Elements) darstellt. Du würdest also die Adresse der Adresse übergeben (gibts auch, macht hier aber keinen Sinn).
2. Probier mal
std::cout << eingabe;
-
Ahhh, verstehe!
2. Ohh sieht doch gleich besser aus
Danke!Lg Mentras
-
Du kennst aber
std::string?Ich verstehe schon, dass es dir hier eher ums Verständnis von Zeigern geht. Wenn du aber etwas erreichen willst (z.B. Verschlüsselung), solltest du moderne C++-Mittel verwenden.
-
Nexus schrieb:
Du kennst aber
std::string?Ich verstehe schon, dass es dir hier eher ums Verständnis von Zeigern geht. Wenn du aber etwas erreichen willst (z.B. Verschlüsselung), solltest du moderne C++-Mittel verwenden.
Jap ich habe ja oben gesagt, dass ich es mal mit C-String versuchen will x)
String wäre ja kein Problem für mich gewesen.
Ich kann dir auch versichern, dass ich wenn ich mich in den Bereich der Kryptographie nisten will, meine Verschlüsselungen mit std::string verschlüssele x)
Lg Mentras
-
Mentras schrieb:
char eingabe[1024] = {0}; //... rot3_func(eingabe); //Wieso [...] nicht: rot3_func(&eingabe);eingabe ist ein array von char und die Funktion erwartet ein char*. C und C++ führen hier einen "Array-zu-Zeiger-Verfall" durch. Dabei wird ein Zeiger erzeugt, der auf das erste Element des Arrays zeigt. Von Hand durchgeführt müsste es dann so aussehen:
rot3_func(&eingabe[0]);Man achte auch auf die Präzedenz der Operatoren. Zunächst werden die Operatoren auf der rechten Seite von innen nach außen verarbeitet und dann die Operatoren auf der linken Seite von innen nach außen ==> Zeiger auf das erste Element. Wenn Du den Addressoperator auf das Array loslässt, bekommst Du einen Zeiger auf ein Array und nicht einen Zeiger auf das erste Element:
char (*parray)[1024] = &eingabe; // parray ist ein Zeiger auf ein Array von charGruß,
SP
-
Sebastian Pizer schrieb:
Mentras schrieb:
char eingabe[1024] = {0}; //... rot3_func(eingabe); //Wieso [...] nicht: rot3_func(&eingabe);eingabe ist ein array von char und die Funktion erwartet ein char*. C und C++ führen hier einen "Array-zu-Zeiger-Verfall" durch. Dabei wird ein Zeiger erzeugt, der auf das erste Element des Arrays zeigt. Von Hand durchgeführt müsste es dann so aussehen:
rot3_func(&eingabe[0]);Gruß,
SPOh, nagut ich versuch´s mal wiederzugeben was ich verstanden habe...
Wenn ich den &-Operator verwenden wollte hätte ich´s so machen müssen:
Beim Aufrufen:
for(int i=0;eingabe[i]!='\0';i++) rot3_func(&eingabe[i]);Wäre natürlich jetzt etwas umständlicher, aber mir geht´s jetzt nur ums verstehen.
Lg Mentras
-
Mentras schrieb:
Wenn ich den &-Operator verwenden wollte hätte ich´s so machen müssen:
for(int i=0;eingabe[i]!='\0';i++) rot3_func(&eingabe[i]);Nein. Einfach
rot3_func(&eingabe[0]);Hier ist ein anderes Beispiel
char array[999]; char* p1 = array; // "array-to-pointer decay" (automatisch) char* p2 = &array[0]; // manuellp1 und p2 zeigen jeweils auf das erste Element des Arrays.
Gruß,
SP
-
Sebastian Pizer schrieb:
Mentras schrieb:
Wenn ich den &-Operator verwenden wollte hätte ich´s so machen müssen:
for(int i=0;eingabe[i]!='\0';i++) rot3_func(&eingabe[i]);Nein. Einfach
rot3_func(&eingabe[0]);Hier ist ein anderes Beispiel
char array[999]; char* p1 = array; // "array-to-pointer decay" (automatisch) char* p2 = &array[0]; // manuellp1 und p2 zeigen jeweils auf das erste Element des Arrays.
Gruß,
SPUnd der Zeiger ändert dann alle Elemente in der Funktion?