strcmp() Problem
-
du mit deiner fixen Idee strcmp()
#include <stdio.h> #include <string.h> // wenn C dann C-Header - wenn C++ dann ... int main() // warum was anderes? { char test1[5]; char test2[]={"nein"}; struct tabelle{ char Name[10]; char Vorname[10]; char Strasse[15]; char Hausnummer[10]; char Stadt[10]; }spravka; int i = 0; do { printf("\nWie ist Ihr Name?:"); scanf("%s", spravka.Name); printf("\nWie ist Ihr Vorname?:"); scanf("%s", spravka.Vorname); printf("\nGeben Sie bitte ihre Strasse ein!:"); while(gets(spravka.Strasse)[0]=='\0'); sscanf(spravka.Strasse,"%s"); printf("\nWie ist Ihre Hausnummer?:"); scanf("%s", spravka.Hausnummer); printf("\nGeben Sie bitte Ihre Stadt ein:"); scanf("%s", spravka.Stadt); printf("\n\nBitte ueberpruefen Sie ihre Daten!\n\n"); printf("%s ""%s\n""%s " "%s\n" "%s\n", spravka.Name, spravka.Vorname, spravka.Strasse, spravka.Hausnummer, spravka.Stadt); printf("\n\nSind Ihre Daten Korrekt? ja/nein: "); scanf("%s", &test1); // hier gibst du erst test1 ein i=(strcmp(test2, test1)); // deshalb Abfrage erst hier }while(i == 0); FILE *doc; doc=fopen("docu.txt", "w"); // warum willst du ins Stammverzeichnis? fprintf(doc,"%s\n", spravka.Name); fprintf(doc,"%s\n", spravka.Vorname); fprintf(doc,"%s\n", spravka.Strasse); fprintf(doc,"%s\n", spravka.Hausnummer); fprintf(doc,"%s\n", spravka.Stadt); fclose(doc); printf("\n\nDatei geschrieben!\n"); }
MfG f.-th.
-
#include <string.h> // wenn C dann C-Header - wenn C++ dann ...
Bei mir steht ja ein C header oder?
int main() // warum was anderes?
Wenn man int vor main stellt dann möchte das Programm wenn es ausgeführt wird ein wert zurück geben, deshalb muss man es erst z.B. um return 1; erweitern, bei void braucht man das nicht.
deshalb Abfrage erst hier
Hab ich auch schon gedacht aber es hat trotzdem irgendwie keine auswirkung auf do while schleife, steht immer noch irgendwie auf "true"
warum willst du ins Stammverzeichnis?
Ich habs so gelernt :)... aber jetzt weiß ich dass es auch anders geht, danke!
-
Devis schrieb:
Bei mir steht ja ein C header oder?
Nein, bei dir steht <string>, nicht <string.h>...
Devis schrieb:
Wenn man int vor main stellt dann möchte das Programm wenn es ausgeführt wird ein wert zurück geben, deshalb muss man es erst z.B. um return 1; erweitern, bei void braucht man das nicht.
void main() gibt es aber nicht. Die meisten Compiler akzeptieren das zwar, falsch ist es trotzdem (und es ist möglich, dass dein Programm mit einem anderen Compiler einen Fehler ausspuckt). Außerdem hat der ja auch einen Grund. Manchmal will man die Rückgabe schließlich verarbeiten...
-
Führe das Programm auf der Kommandozeile aus.
Bei einigen Editoren oder IDEs funktionieren nicht alle Konsolenprogramme
nach run, go, ausführen oder was auch immer da steht.Mein letzter Quelltext sollte funktionieren, wenn du bei do-while "nein" oder
alternativ was anderes eingibst. Also "nein" komplett mit allen 4 Buchstaben
Wenn du das nur als "j" oder "n" haben willst, programmier es halt entsprechendMfG f.-th.
-
_matze schrieb:
void main() gibt es aber nicht. Die meisten Compiler akzeptieren das zwar, falsch ist es trotzdem ...
ich weiss echt nicht, warum sich dieses gerücht so hartnäckig hält.
c-standard schrieb:
In a freestanding environment (in which C program execution may
take place without any benefit of an operating system), the name
and type of the function called at program startup are
implementation-defined.also, auch 'void main()' ist möglich.
-
+fricky schrieb:
also, auch 'void main()' ist möglich.
Aber unportabel und daher sollte man es nie nie niemals machen, außer man kann wirklich nicht anders.
-
rüdiger schrieb:
...nie nie niemals...
ach, quark. zeig mir ein reales beispiel (keine konstruierten fälle), wo 'void main' ärger macht. ich hab's noch nie erlebt.
-
f.-th. schrieb:
Mein letzter Quelltext sollte funktionieren, wenn du bei do-while "nein"
MfG f.-th.
Es funktioniert nicht, ich meine da ist immer noch das selbe Problem, die do while schleife steht aus irgendeinem Grung auf true, egal was man eingibt, "ja" oder "nein", das Program setzt mit dem Erstellen der Datei docu.txt fort...
-
bei mir funzt die f-th variante
-
anonymouse schrieb:
bei mir funzt die f-th variante
Jetzt hab ich das Problem gelöst, so funktioniert es:
#include <stdio.h> #include <string.h> int main() { char test1[5]; char test2[]={"nein"}; struct tabelle{ char Name[10]; char Vorname[10]; char Strasse[15]; char Hausnummer[10]; char Stadt[10]; }spravka; int i; do { printf("\nWie ist Ihr Name?:"); scanf("%s", spravka.Name); printf("\nWie ist Ihr Vorname?:"); scanf("%s", spravka.Vorname); printf("\nGeben Sie bitte ihre Strasse ein!:"); while(gets(spravka.Strasse)[0]=='\0'); sscanf(spravka.Strasse,"%s"); printf("\nWie ist Ihre Hausnummer?:"); scanf("%s", spravka.Hausnummer); printf("\nGeben Sie bitte Ihre Stadt ein:"); scanf("%s", spravka.Stadt); printf("\n\nBitte ueberpruefen Sie ihre Daten!\n\n"); printf("%s ""%s\n""%s " "%s\n" "%s\n", spravka.Name, spravka.Vorname, spravka.Strasse, spravka.Hausnummer, spravka.Stadt); printf("\n\nSind Ihre Daten Korrekt? ja/nein: "); scanf("%s", &test1); }while(i=(strcmp(test2, test1)) == 0); FILE *doc; doc=fopen("docu.txt", "w"); fprintf(doc,"%s\n", spravka.Name); fprintf(doc,"%s\n", spravka.Vorname); fprintf(doc,"%s\n", spravka.Strasse); fprintf(doc,"%s\n", spravka.Hausnummer); fprintf(doc,"%s\n", spravka.Stadt); fclose(doc); printf("\n\nDatei geschrieben!\n"); return 1; }
Da gibt es noch ein kleines Problem, wenn man die .exe datei erstellt und versucht das Programm aus, dann kommt es an dieser stelle:
while(gets(spravka.Strasse)[0]=='\0'); sscanf(spravka.Strasse,"%s");
zu absturz, ich verstehele diese zeile selber erlich gesagt nicht, gibt es eine einfachere Methode strings zu lesen und und leerstellen zu ignorieren, also im prinzip die zeilen übernehmen so wie man sie eingibt?
-
das ist doch käse und gets ist sowieso käse
-
anonymouse schrieb:
das ist doch käse und gets ist sowieso käse
was meinst du mit käse
???
-
kann mir denn niemad helfen?
wo kann man das nachlesen wie die funktion sscanf() mit dieser
while(gets(spravka.Strasse)[0]=='\0'); kommuniziert...while(gets(spravka.Strasse)[0]=='\0'); sscanf(spravka.Strasse,"%s");
ich verstehe die logik dahinter nicht...
-
die sscanf zeile kannste auch weglassen, einmal wegen dem semikolon hinter der while-schleife und zum anderen, weil die sscanf parameter unvollständig sind.
-
und warum man gets nicht nehmen sollte, kannst du auf jeder dritten c-seite nachlesen.
z.b. hier:
http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_025_000.htmnimm lieber fgets
-
Laß doch das int i ganz weg in deinem Code
while(strcmp(test2, test1) == 0);
damit sollte dein Compiler klarkommen.
Mehrere Operationen in einer Zeile fördern nicht die Lesbarkeit
MfG f.-th.
-
f.-th. schrieb:
while(strcmp(test2, test1) == 0);
damit sollte dein Compiler klarkommen.
klar, endlosschleifen sind ja erlaubt.
-
Leute kann mir jemand sagen warum dieser einfacher fall nicht funktioniert?
Die Variablen sollen in der funktion "lese" ihr Wert erhalten und dann soll wieder in der main() funktion die gleichung c= a + b; gelöst werden.
Der compiler sagt dass man die Variablen erstmal initialisieren soll, wenn ich diese mit null "0" initialisiere bekomme ich im Programm dierekt bei der ersten Zahl angabe Programm absturz.
#include <stdio.h> int lese(int a, int b) { printf("Geben Sie eine Zahl fuer a ein: "); scanf("%i", a); printf("\nGeben Sie eine Zahl fuer b ein: "); scanf("%i", b); return (1); } void main() { int a; int b; int c; lese(a , b); c = a + b; printf("\n\nC ist gleich %i\n", c); }
-
Probier mal so:
int lese(int *a, int *b) //call-by-reference, Übergabe von Zeigern ... int a; int b; lese(&a , &b); }
Wenn du den Inhalt der Variablen in der Funktion ändern willst, dann musst du by-reference übergeben. Sonst (call-by-value) werden Kopien der Variablen angelegt und in der Funktion verwendet. Die Ursprungswerte werden also nicht verändert, das ist ja nicht was du willst.
-
_matze schrieb:
Probier mal so:
int lese(int *a, int *b) //call-by-reference, Übergabe von Zeigern ... int a; int b; lese(&a , &b); }
Wenn du den Inhalt der Variablen in der Funktion ändern willst, dann musst du by-reference übergeben. Sonst (call-by-value) werden Kopien der Variablen angelegt und in der Funktion verwendet. Die Ursprungswerte werden also nicht verändert, das ist ja nicht was du willst.
Vielen Dank es funktioniert, ehrlich gesagt das ist ein bischen verwirrend,
z.b wenn man statt int a, char a[5] nimmt dann darf man nicht mehr dieses & "und" vorne dran schreiben sonst zeigt der compiler fehler, aber ist es nicht das selbe?
int lese(char *a, int *b) //call-by-reference, Übergabe von Zeigern ... char a[5]; int b; lese(&a , &b); }
***********
Ich versuch mal selber auf meine Frage zu Antworten:
Man darf das & "und" Zeichen deswegen nicht vor a[5] stellen, weil das ein adressirungs zeichen ist der nähmlich einer bestimmten adresse ein Wert adressiert, da aber a[5] ein Array ist besteht er aus vielen adressen z.b
10001 10002 10003 10004 10005
der Compiler kann physisch nicht ein Wert einer Adresse adressiren die aber keine Adresse ist, sondern eine menge von Adressen in gegensatz zu int a;
Richtig??