zeiger mit widerholschleife
-
hi,ich hoffe mir kann einer helfen
mein programm soll solange laufen bis ein von n verschiedener buchstabe eingegeben wird.ich habe 2 varianten von denen die erste funktioniert die zweite jedoch nicht könnte mir bitte jemand erklären wo genau der uNTERSCHIED LIEGT?1.vARIANTE:
#include <stdio.h> int main() { char eingabe='j',*puffer; while(eingabe=='j'){ system("clear"); printf("eingabe:"); scanf("%s",puffer); eingabe=*puffer1; } return 0; }
2.vARIANTE:
#include <stdio.h> int main() { char eingabe='j'; while(eingabe=='j'){ system("clear"); printf("eingabe:"); scanf("%s",eingabe); } return 0; }
ich verstehe wirklich nicht wo der Unterschied ist.In der ersten Variante wird eingabe durch einen zeiger beschrieben und in der 2ten direkt durch scanf jedoch ist der inhalt doch der selbe oder?
danke
-
Hallo,
zuerst mal, wenn Du nur einen Buchstaben einlesen willst, dann must Du das mit scanf("%c",...) machen, mit 's' liest Du einen String ein, der sich ja vom char unterscheidet.
Dann ist es halt so, daß scanf eine Adresse will. Bei Deiner ersten Eingabe mit
scanf("%c",puffer);
hast Du ja eine Adresse angegeben, da Du ja den Zeiger übergeben hast.
beim zweiten mal, benutzt Du jedoch die Variable selber, scanf braucht aber nur die Adresse der Variablen. Da kannst Du den & Operator nutzen. Vor eine Variable gestellt, liefert es die Adresse der Variable
also stattscanf("%c",eingabe);
einfach
[code]
scanf("%c",**&**eingabe);[/code]Bei Deinem ersten Beispiel solltest Du besser, den Zeiger gleich bei der Initialisierung mit der Variable zu verknüpfen. Also mit 'char *puffer=&eingabe'.
Der Zeiger zeigt dann nicht sonstwo hin. Und kann daher auch nichts kaputtmachen.grüße Con@n
[ Dieser Beitrag wurde am 03.04.2003 um 22:51 Uhr von Con@n editiert. ]
-
Original erstellt von <martin>:
**
ich verstehe wirklich nicht wo der Unterschied ist.In der ersten Variante wird eingabe durch einen zeiger beschrieben und in der 2ten direkt durch scanf jedoch ist der inhalt doch der selbe oder?**beide varianten sind gleich - und beide falsch.
dass die eine funktioniert ist nicht mehr als ziemliches glück von dir - denn sie kann genausogut nicht funktionieren (das nennt man undefiniertes verhalten)
-
ok ok ich gebe zu meine ersten 2 varianten waren sehr fehlerhaft und sind beide falsch jedoch hab ich hier noch 2 varianten wo ich auch nicht recht einen unterschied sehe
#include <stdio.h> int main() { char eingabe='j',puffer[0]; while(eingabe=='j'){ system("clear"); printf("eingabe:"); scanf("%s",&puffer[0]); eingabe=puffer[0]; } return 0; }
und
#include <stdio.h> int main() { char eingabe='j'; while(eingabe=='j'){ system("clear"); printf("eingabe:"); scanf("%c",&eingabe); } return 0; }
Könntet ihr mir den an diesen 2 Beispielen den Unterschied erklären?Wieso funktioniert das erste.Das zweite übergibt die variable doch lediglich über ein 1 zeichen grosses Feld oder?
-
ich muss dazusagen das die 1te variante funktioniert ,die 2te jedoch nicht und das verwirrt mich
danke
-
Och manno wie lange proggst du so schon?
Deine erste Variante geht auch nicht!
Also so ist es richtig:
#include <stdio.h> int main() { char eingabe='j',puffer[1]; // arreys brauchen einen NULL terminator! while(eingabe=='j') { system("cls"); // so gehts printf("eingabe:"); scanf("%s",&puffer[0]); strcpy(eingabe,puffer[0]); // so kopiert man strings } return 0; } // zweite Variante #include <stdio.h> int main() { char eingabe='j'; while(eingabe=='j') { system("cls"); // so ist es richtig printf("eingabe:"); scanf("%c",&eingabe); } return 0; }
system clear gibts net.
besser währe clrscr aus der conio.h (welchen compiler benutzt du?)
Außerdem ist das puffer arrey unsinn wo du doch ein normales char nemen kannst!P.S.: Die erste Variante konnte ich nicht testen.
[ Dieser Beitrag wurde am 07.04.2003 um 12:51 Uhr von quizzmaster editiert. ]
-
hallo,
da ich ein unix system nutze ist system("clear") schon richtig,da ich den Befehl clear in der Konsole ausführe.Die 1 Variante hatte ich getestet und sie geht auch.Die 2te jedoch geht nicht.
Ich wolte eigentlich nur wissen wieso ich einen puffer definieren muss obwohl ich das Zeichen doch auch direkt über scanf einlesen kann.In der 2ten Variante läuft die schleife nicht weiter obwohl ich j eingabe in der ersten mit einem Puffer jedoch schon.Kann mir das mal einer klar machen.Ich glaub das hat irgendwas mit dem Enter-Zeichen zu tun.
PS:bitte keine weiteren Hinweise wie schlecht mein programm ist ich will nur wissen wieso die 2 te variante nicht funkt.
Danke
-
Also, bei mir funzt folgendes Programm tadellos:
#include <stdio.h> #include <stdlib.h> int main() { char eingabe = 'j'; while(eingabe == 'j') { system("cls"); printf("Eingabe: "); scanf("%c", &eingabe); } return 0; }
-
@Quizmaster:
strcmp(eingabe,puffer[0]); // so kopiert man stringsSo bestimmt nicht - so vergleichst du sie! Wetten, daß was du machst gibt ne Access Vio, weil eingabe nur ein char ist, das NICHT null terminiert ist?
Wenn du kopierst, dann mit strcpy
Das kopieren eines Zeichens währe dann wenn schon strcmp( ); Das funktioniert aber nicht, da es sich nur um 1 Zeichen handelt.
eingabe = pbuffer[0] past scho
-
okok hatte mich verschrieben , aber bei mir funzt eingabe = puffer[0] net.
-
Dann sei dir verziehen
-
also wenn ich das programm compiliere und als eingabe j eingebe beendet er das programm obwohl
die schleife weiter laufen solte.Wieso geht das bei mir nicht?ich nutze gcc.
danke
-
Lad dir nen anderen Compiler mit IDE herunter.
z.B. den Borland C++( http://www.borland.de ) oder Dev-C++( http://www.bloodshed.com )
-
sowohl borland als auch bloodshed sind compiler für windows was ich jedoch nicht habe.
Ich glaube Bloodshed Dev setzt auch auf gcc auf
-
#include <stdio.h>
#include <stdlib.h>
Du hast vielleicht Probleme!int main() { char eingabe = 'j'; while(eingabe == 'j') { system("cls"); printf("Eingabe: "); fflush(stdin); //Nie vergessen den Tastaturpuffer zu löschen!!! scanf("%c", &eingabe); } return 0; }
----
FREAK
-
Original erstellt von <FREAK>:
**system("cls");
fflush(stdin); //Nie vergessen den Tastaturpuffer zu löschen!!!
**Ui, gleich 2x systemabhängiges Verhalten... Es gibt auch noch was anderes als Microsoft.
-
Original erstellt von <FREAK>:
fflush(stdin); //Nie vergessen den Tastaturpuffer zu löschen!!!fflush(stdin); legt ein undefiniertes Verhalten an den Tag.
D.h., die Funktion kann den Eingabepuffer löschen oder auch die Festplatte.
Trotzdem wird die Funktion leider viel zu häufig in Büchern benutzt.
-
Statt immer mit eurem "Undefinierten Verhalten" zu kommen, könntet ihr doch lieber mal sagen wie ihr eurer Meinung nach am besten fflush(); umgehen würdet?
-
while(getchar() != '\n');