strcmp() Problem



  • f.-th. schrieb:

    Wenn dein Programm nicht zu lang ist, poste hier mal mehr von deinem
    Code. Mich interessiert warum das

    goto 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 entsprechend 😉

    MfG 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... 😕


Anmelden zum Antworten