strcmp() Problem
-
Hallo ich habe eine kleines Problem, ich möchte dass mein Programm zwei strings vergleicht und zwar mit der Funktion if();
Ich habe im Internet diese Funktion strcmp() gefunden die dazu benutz wird zwei strings zu vergleichen, ich habe alles eingegeben wie es sein soll, der Compiler mekert auch nicht allerdigs bekomme ich im Programm ablauf genau an der Stelle Error: str!=0
Hier ist der Ausschnitt aus dem Programm:
char test1[5]; char test2[6]={"nein\0"}; printf("\n\nSind Ihre Daten Korrekt? ja/nein: "); scanf("%s", &test1); if((strcmp(test1, test2)) == 0 ) { goto restart; }
Was habe ich falsch gemacht?
-
Wenn dein Programm nicht zu lang ist, poste hier mal mehr von deinem
Code. Mich interessiert warum dasgoto restart;
notwendig ist.
MfG f.-th.
-
f.-th. schrieb:
Wenn dein Programm nicht zu lang ist, poste hier mal mehr von deinem
Code. Mich interessiert warum dasgoto restart;
notwendig ist.
MfG f.-th.
#include <stdio.h> #include <string> #include <iostream> void main() { char test1[5]; char test2[6]={"nein\0"}; struct tabelle{ char Name[10]; char Vorname[10]; char Strasse[15]; char Hausnummer[10]; char Stadt[10]; }spravka; restart: 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); if((strcmp(test1, test2)) == 0 ) { goto restart; } FILE *doc; doc=fopen("C:\\", "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"); }
-
Nur auf die Schnelle:
Warum C++ Header? Sehe nix warum du die brauchen solltest.
Mischen von C und C++ Header beschert einem manchmal seltsame Fehler
Warum statt des goto-Gedöns z.B. keine do-while-Schleife?Für dein eigentliches Problem bin ich jetzt zu müde.
MfG f.-th.
-
Das strcmp funktioniert schon. Wenn die Strings gleich sind, wird 0 zurückgegeben. Den Fehler "Error: str!=0" musst du aber nochmal erklären...
Btw, pack das goto wieder ein und löse es mit einer while-Schleife (oder do-while).
-
bin doch noch halbwach:
warum void main und nicht int main?
Was hast du hier vor
doc=fopen("C:\\", "w");
MfG f.-th.
-
_matze schrieb:
Das strcmp funktioniert schon. Wenn die Strings gleich sind, wird 0 zurückgegeben. Den Fehler "Error: str!=0" musst du aber nochmal erklären...
Btw, pack das goto wieder ein und löse es mit einer while-Schleife (oder do-while).
Hallo, ich habe jetzt eine do while schleife verwendet aber das Problem ist immer noch nicht beseitig, kommt immer noch der selbe Fehler:
#include <stdio.h> #include <string> void main() { char test1[5]={""}; char test2[6]={"nein"}; struct tabelle{ char Name[10]; char Vorname[10]; char Strasse[15]; char Hausnummer[10]; char Stadt[10]; }spravka; int i = 0; do { i=(strcmp(test2, test1)); 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<1); FILE *doc; doc=fopen("C:\\", "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"); }
-
Peinlich,,
ich hab vergessen an dieser Stelle
doc=fopen("C:\\", "w");
den die datei anzugeben, wohin die Daten geschrieben werden sollen!
Es muss heißen:doc=fopen("C:\\dokument.txt", "w");
Es lag nicht an strcmp(),, jetzt funktioniert alles!
Danke!
-
Halt doch nicht, jetzt wird das Programm aufgeführt und datei geschrieben, aber es verhält sich so als ob das Programm die do while schleife nicht sieht, also als on sie ständig auf "true" ist... also jetzt ist das ein strcmp problem!!!
hmm ich komme nicht weiter!
-
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