char nach Zeichen absuchen



  • Hallo, ich habe folgenden Code:

    #include <stdio.h>
    
    int main()
    {
    int zaehler;
    char text[100];
    char *ausgabe;
    FILE *datei;
    
    sprintf(text, "Peter&send=OK");
    
    while(text[zaehler] != '&')
    {
       ausgabe[zaehler] = text[zaehler];
       zaehler++;
    } 
    datei = fopen("C:\\pub\\datei.txt", "w");
    fputs (text, datei);  
    fclose(datei);
    
    return 0;
    }
    

    ich möchte die Variable text bis zum "&" auslesen und die Zeichen davor in eine Datei schreiben, also dass nur noch Peter übrig bleibt.

    So funktioniert das nicht, weiß jemand wieso? Der Code kompiliert zwar, allerdings stürzt das Programm immer ab.



  • #include <stdio.h>
    
    int main()
    {
    int zaehler;
    char text[100];
    char *ausgabe;
    FILE *datei;
    
    sprintf(text, "Peter&send=OK");
    
    for(zaehler = 0; text[zaehler] != '&'; zaehler++)
    {
       ausgabe[zaehler] = text[zaehler];
    } 
    
    datei = fopen("C:\\pub\\datei.txt", "w");
    fputs (ausgabe, datei);  
    fclose(datei);
    
    return 0;
    }
    

    so funktionierts zwar, allerdings hab ich dann in der Textdatei "Peterÿÿÿ" stehen 😞



  • while(text[zaehler] != '&')
    {
       ausgabe[zaehler] = text[zaehler];
       zaehler++;
    }
    
    • zaehler ist undefiniert und kann daher eine x-beliebige Zahl sein, womit der erste Array-Zugriff ins Blaue geht.
    • ausgabe ist undefiniert und zeigt daher auf eine x-beliebige Speicherstelle, die nie reserviert wurde und dadurch auch nichts reingeschrieben werden kann.

    Du kannst die Funktion strchr verwenden (siehe Beispiel unten).



  • ich brauche ja nicht die Stellen an denen das & steht, sondern die Zeichen bis dahin.

    Weiß niemand wo der Fehler bei meiner for-schleife liegt?



  • Du hast keine for-Schleife.
    Deine Fehler hat Youka schon gezeigt.



  • im zweiten post hab ich eine for-schleife reingebastelt...

    wie gehe ich mit der strchr denn vor? soll ich da erst die position bestimmen und dann die zeichen von position 1 bis "gefundene position - 1" ausgeben?



  • zuerst solltest du mal dafür sorgen, dass ausgabe auf reservierten speicher zeigt
    und beim neuen string das '\0' nicht vergessen



    1. Definiere ausgabe ebenfalls als char Array, wie auch text, damit du überhaupt in einen Speicherbereich reinschreibst.
    2. Füge nach der Schleife ausgabe noch das String-Terminierungszeichen an, damit es überhaupt ein vollendeter String ist, den fputs richtig ausgeben kann.
    3. Setze als zweite Abbruchbedingung für die Schleife noch das Ende von text hinzu, damit sie bei einem Nicht-Fund dennoch rechtzeitig stoppt.
    4. Alternativ:
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        // Declarations
        int zaehler;
        char text[100], *found, ausgabe[100];
        FILE *datei;
        // Set text
        sprintf(text, "Peter&send=OK");
        // Search for character '&' in text
        found = strchr(text, '&');
        if(found){
            // Copy found to ausgabe
            memcpy(ausgabe, text, found-text);
            ausgabe[found-text] = '\0';
            // Write ausgabe to file
            datei = fopen("C:\\pub\\datei.txt", "w");
            fputs (ausgabe, datei);  
            fclose(datei);  
        }
        return 0;
    }
    

  • Mod

    Oder viel einfacher: Anstatt mehrmals die gleiche Zeichenkette zu durchlaufen, machen wir einfach nur das was wir wollen (hier: Ausgeben) bis wir auf das Abbruchzeichen stoßen. Keinerlei Zeichenkettengefummel nötig.

    Trotzdem verspricht der Threadersteller bitte, sich ganz dringend die Grundlagen zu Zeichenketten reinzuziehen.



  • Moin Moin,

    hab den Code jetzt für 2 Informationen aus nem String umgebaut und funktioniert auch soweit. Ob es nun eine elegantere Methode gibt, weiß ich nicht, vermute aber schon 😉

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        // Declarations
        int zaehler;
        char text[100], *found, nachname[100], vorname[100], ausgabe[100];
        FILE *datei;
        // Set text
        sprintf(text, "Peter&nachname=Stutz&send=OK");
        // found1 nach '&'-Zeichen durchsuchen
        found = strchr(text, '&');
    
        if(found)
    	{
            // Copy found to ausgabe
            memcpy(vorname, text, found-text);
            vorname[found-text] = '\0';
    
    		// Scanne found1 bis zum nächsten Wert und kopiere in text
    		sscanf(found, "&nachname=%s", text);
    		found = strchr(text, '&');
    
    		if(found)
    		{
    		memcpy(nachname, text, found-text);
    		nachname[found-text] = '\0';
    		}
    		// Ausgabe in Textdatei
    		datei = fopen("C:\\pub\\datei.txt", "w");
    		sprintf(ausgabe, "Vorname: %s \nNachname: %s", vorname, nachname);
    		fputs (ausgabe, datei);  
            fclose(datei);  
    
        }
        return 0;
    }
    

    Danke an alle


  • Mod

    Sehr umständlich. Du gehst alles mehrmals durch, obwohl man alles in einem Rutsch machen könnte.

    Weiterhin liegt hier das von Forennutzer Sone so oft bemängelte X-Y-Problem vor. Du fragst nach X:

    Stutzpeter schrieb:

    ich möchte die Variable text bis zum "&" auslesen und die Zeichen davor in eine Datei schreiben, also dass nur noch Peter übrig bleibt.

    Dabei war dein eigentliches Problem die ganze Zeit Y: Wie zerlegt man Zeichenketten der Form "Peter&nachname=Stutz&send=OK" in Vorname und Nachname?

    Darauf hättest du sofort die kurze und gute Antwort erhalten, die 99% deines Programms überflüssig macht:

    #include <stdio.h>
    
    void print_first_and_last_name(const char *str)
    {
      char nachname[100], vorname[100];
      if (sscanf(str, "%99[^&]%*[^=]=%99[^&]", vorname, nachname) == 2) // Hier passiert die Magie
        printf("Vorname: %s\nNachname: %s\n", vorname, nachname);
      else puts("Fehler beim Parsen");
    }
    
    int main()
    {
      // Demo
      print_first_and_last_name("Peter&nachname=Stutz&send=OK");
      print_first_and_last_name("Karl-Theodor Maria Nikolaus Johann Jacob Philipp "
                                "Franz Joseph Sylvester und noch ein paar Vornamen "
                                "um zu zeigen was passiert wenn die Zeichenkette zu"
                                " lang wird&nachname=Freiherr von und zu Guttenberg&send=OK");
      return 0;
    }
    

    Man könnte sich hier auch den Umweg über die Variablen vorname und nachname sparen und die Namen direkt ausgeben, aber ich nehme weiterhin mal an, dass dein Y auch beinhaltet, dass du mit den Namen weiter arbeiten kannst, obwohl dein X bloß reine Ausgabe ist.


Log in to reply