pointer-inkrementierung funktioniert nicht
-
Vielen Dank
ihr und das Forum seid icht der Hammer: So schnell hab ich noch nie Hilfe bekommen.
Danke
-
hohesC schrieb:
So läuft deinerster code:
#include <stdio.h> #include <conio.h> int main() { char text[100]={0}; char *pointer; //Pointer/Zeiger int x=0; fgets(text,100,stdin); pointer=&text[0]; //adresse von text[0] an zeiger übergeben while(pointer[x]) //so lange bis pointer[x] NULL liefert { putchar(pointer[x]); //ausgabe der einzelnen Zeichen text[x++]; //immer um eins inkrementieren } getch(); }
ausserdem fehlt conio.h
mfg hohesC
1. Wofür brauchst du pointer??
2. Was bringt dir bitte text[x++]; ?? (Dass du mit x++ x um 1 erhöst ist klar, aber der Rest???)3. pointer = &text[0], warum nicht einfach pointer = text ??
@mxpower
Zur Erklärung, warum das nicht so funktioniert wie du das am Anfang gemacht hast.Wie SeppSchrott schon geschrieben hat, ist text bei dir ein Array. Die Verwendung des Variablennamens deines Arrays musst du dir vorstellen, wie bei einem konstanten Zeiger. Was eine Konstante ist, weißt du hoffentlich. Auf jeden Fall kannst du den Wert von einer Konstanten nicht mehr ändern und genauso verhält es sich bei einem konstanten Zeiger. Er ist konstant, also darf er nicht verändert werden. Die Anweisung text++; würde ihn aber ändern, was du ja nicht darfst. Darum geht es nicht.
-
hohesC schrieb:
@Sepp...: das ist das C++ FAQ
Na und?
So unterschiedlich ist die Pointer/Arraybehandlung dort ja nun nicht
-
ich bin gerade dabei C zu lernen
es könnte ihn etwas verwirren mit cout,cin.... usw.
für dich ist das klar was die unterschiede sindmfg hohesC
-
in der Tat hat es mich etwas verwirrt aber das Problem hab ich jetzt verstanden.
Dummer weise hab ich jetzt nen anderes(hat aber nichts mit pointern zu tun).Beim folgenden Programm scheint der Compiler ohne ersichtlichen Grund eine Zeile zu überspringen: Warum?:#include <stdio.h> #define max 80 void ersetze_zeichen(char *s, char alt, char neu){ while(*s){ if(*s==alt) *s=neu; s++; } } main(){ char s[max]; char altz,neuz; printf("Geben sie einen Satz ein"); gets(s); printf("Welches Zeichen soll ersetzt werden?\n"); scanf("%c",&altz); printf("Welches Zeichen soll dafuer gesetzt werden?\n"); getchar(); /*Dies musste ich kommischerweise machen, damit die folgende Zeile nicht übersprungen wird*/ scanf("%c",&neuz);/*Diese Zeile scheint übersprungen zu werden*/ ersetze_zeichen(s,altz,neuz); printf("%s",s); getch(); }
-
Du hast 2 abfragen.
Sobald du die eine mit einem enter abschließt bleibt die eingebe die enter-taste(\n) noch im eingabe puffer gespeichert.Bei der nächsten abfrage wird somit das enter(\n) übergeben und die eingabe funktion scanf sofort beendet.
Mit fflush(stdin); kannst du den eingabe puffer leeren.
gruß hohesC
-
@mxpower
Das Problem ist hinlänglich bekannt :D.
Dein getch() am Schluss wird auch übersprungen, oder??Das Problem ist ganz einfach, dass im Eingabepuffer noch was drin steht und dieses dann beim nächsten Einlesen auch interpretiert wird. Bei scanf("%c", &altz) gibst du vermutlich ein Zeichen ein und drückst dann ENTER. Das ENTER wird aber nicht gleich ausgelesen, d. h. beim Aufruf von getchar() bzw. dem nächsten scanf() wird sofort das ENTER gelesen und damit die Eingabe gleich beendet.
Ein mögliche Lösung ist, dass du bei scanf() immer ein \n (Zeilenumbruch, durch ENTER) miteinliest. Also z. B.:... scanf("%c\n", &altz); ...
gets() sollte man übrigens nicht verwenden, da man Bufferoverflows riskiert, d. h. wenn man mehr Zeichen eingibt, als die Zielvariable speichern kann, dann überschreibst du Speicher anderer Variablen was ungewöhnliche Phänomene hervorrufen kann oder du schreibst dadurch sogar in Speicherbereiche, die gesperrt sind, was dann gleich zu einem Programmabsturz führt.
Als Alternative bietet sich fgets() an. Dort kannst du angeben, wieviele Zeichen maximal in der Zielvariablen gespeichert werden dürfen.Beispiel:
char eingabe[100]; ... fgets(eingabe, 100, stdin); //von der Tastatur (= stdin im Normalfall) einlesen
Beim Beispiel werden maximal 99 Zeichen in eingabe gespeichert. Eingeben kannst du über die Tastatur übrigens mehr als 99 Zeichen. Diese werden aber erst beim nächsten Aufruf einer Einlesefunktion übertragen.
-
hohesC schrieb:
Du hast 2 abfragen.
Sobald du die eine mit einem enter abschließt bleibt die eingebe die enter-taste(\n) noch im eingabe puffer gespeichert.Bei der nächsten abfrage wird somit das enter(\n) übergeben und die eingabe funktion scanf sofort beendet.
Mit fflush(stdin); kannst du den eingabe puffer leeren.
gruß hohesC
Siehe FAQ, warum man fflush(stdin) nicht verwenden soll!
-
Shade of .... schrieb:
...das fflush(stdin) ein undefiniertes verhalten an den tag legt.
Und wir wissen ja alles was undefiniert heisst -> zusammenbruch der kausalitaet oder aehnliches
Ist ja interressant!
mfg hohesC
-