Zum Inhalt springen
  • 0

String zerteilen


Joshi274

Frage

Hallo Leute,

ich bin relativ neu in der Programmierwelt und habe noch keine Große Erfahrung mit Fehlern oder in meinem Fall:

Probleme die auftretten, aber keine Fehlermeldung aufgeben.

Ich habe das Problem das ich via der Funktion strtok einen String zerteile und in ein Array speichern will.

Soweit alles kein Problem, doch wenn ich jetzt die Werte in dem Array mit strcmp (also ja , der Inhalt, nicht der pointer) mit einem 2ten String vergleichen will, dann klappt das bei jedem außer bei dem letzten Abschnitt. Also klappen tut es schon nur stimmen alle überein, nut der letzte will nicht, deswegen meine Frage: Endet der String mit dem letzten Zeichen oder sind dort noch Leerzeichen oder ähnliches angehängt?

Quelltext:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int k, l, u ;

char* stringteiler[10] = {0} ;

char begin[ ] = "D:MAIN esp sending data <" ;

char line [5000] = "D:MAIN esp sending data <75> - give it to gsm"

...

if (strncmp(begin, line, 25) == 0)            // Vergleich
        {
            printf("********This is maybe the right String: %s", line);
            char *ptr;
            char delimiter[] = "<>";
            ptr = strtok(line, delimiter);
            for (u=0; ptr !=NULL; u++)
            {
                printf("section found: %s\n", ptr);
                stringteiler = ptr;
                ptr = strtok(NULL, delimiter);
            }

            for (l=0; l<u; ++l)
            {
                printf ("Stringteiler[%u]: %s\n", l, stringteiler[l]);
            }

            if (strcmp(stringteiler[1], "75") == 0 && strcmp(stringteiler[2], " - give it to gsm") == 0)        //Fehler bei strinteiler[2]
            {
                printf("Condition  is given\n");
            }
            else
            {
                printf("Condition  isn't given\n");
            }

            break;
        }

...

Falls ich was vergessen habe reinzustellen oder etwas falsch übertragen habe, bitte melden. Im Programm selbst funktioniert alles.

Bearbeitet von Joshi274
Link zu diesem Kommentar
Auf anderen Seiten teilen

8 Antworten auf diese Frage

Empfohlene Beiträge

  • 0

Forget it. Ich habe mich deines Problems nun noch mal angenommen und dir einen neuen Code hingeschrieben. Willst du die Zeichen zwischen den Klammern extrahieren oder willst du auch die Teile vorher oder nachher abprüfen? In jedem Fall macht es Sinn, auf das strtok zu verzichten, weil das die Sache wahrscheinlich komplizierter macht. Willst du strtok verwenden, musst du mit einem einzelnen Zeichen (z. B. <) arbeiten und das Resultat auch noch mal zerteilen. Was du alternativ aber machen kannst, ist einfach deinen String zu tokenisieren. In unten stehendem Fall erkennst du quasi, wann die Klammer losgeht und wann sie endet und kannst dann den nachfolgenden bzw. vorherigen Teil einfach in einen neuen Stringbuffer kopieren und damit dann die Stringvergleiche mittels strcmp durchführen.

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void) {
    char* line = "D:MAIN esp sending data <7775> - give it to gsm";
    char* counter = line;

    while (*counter) {
        if (*counter && *counter == '<') {
            counter++;
            printf("%c", counter[0]);

            while (*counter && *counter != '>') {
                counter++;

                if (*counter && *counter == '>') {
                    break;
                }

                printf("%c", counter[0]);
            }
        }

        counter++;
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Dass der String mit einem \0 (nicht /0) terminiert. In einem char* sollte automatisch ein \0 als letztes Zeichen angehängt werden, um den Ende des allokierten und verwendeten Speichers zu kennzeichnen. Durch das Definieren eines char* erzeugst du ja ein Array bzw. allokierst für die Anzahl der Zeichen entsprechenden Speicher und es sollte automatisch ein \0 angehängt werden, damit du weißt, wie weit du iterieren kannst. Dieses Zeichen müsstest du abfragen.

Bearbeitet von D-eath
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 25 Minuten schrieb D-eath:

Willst du strtok verwenden, musst du mit einem einzelnen Zeichen (z. B. <) arbeiten und das Resultat auch noch mal zerteilen.

Nein? Der zweite Parameter von strtok ist const char *. strtok sucht jeweils nach einem Zeichen das im zweiten Parameter enthalten ist oder nicht enthalten ist (je nachdem ob gerade der Anfang oder das Ende des Tokens gesucht wird). Das gezeigte Programm funktioniert ja auch.

Bei mir liefert es diese Ausgabe:

Zitat

********This is maybe the right String: D:MAIN esp sending data <75> - give it to gsm                 
section found: D:MAIN esp sending data                                                                                                
section found: 75                                                                                                                                        
section found:  - give it to gsm                                                                                                                  
Stringteiler[0]: D:MAIN esp sending data                                                                                                
Stringteiler[1]: 75                                                                                                                           
Stringteiler[2]:  - give it to gsm                                 
Condition  is given

Was ist denn jetzt eigentlich der Fehler?

Bearbeitet von _n4p_
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 13 Minuten schrieb _n4p_:

Nein? Der zweite Parameter von strtok ist const char *.

Tja, das war mir entfallen. Danke für den Hinweis! Ich habe bis jetzt immer nur mit einzelnen Separatoren gearbeitet.
Jedenfalls scheint der letzte Teil nicht korrekt abgeprüft zu werden. Ich würde aber gerne mal ein kompilierfähiges Beispiel haben, das nicht funktioniert, da ansonsten auch alles für mich korrekt aussieht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Der Fehler an sich ist das ich nach dem zerteilen den letzten teil, nämlich " - give it to gsm" , nicht mit meinem string, in dem exakt das selbe steht vergleichen kann, er sagt mir dann die seien nicht gleich.

Deswegen war meine Vermutung das vllt hinter dem letzten Abschnitt der strtok Methode noch Leezeichen oder Zeilenumbrüche sind, ansonsten müssten sie doch übereinstimmen

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 5 Stunden schrieb D-eath:

In unten stehendem Fall erkennst du quasi, wann die Klammer losgeht und wann sie endet und kannst dann den nachfolgenden bzw. vorherigen Teil einfach in einen neuen Stringbuffer kopieren und damit dann die Stringvergleiche mittels strcmp durchführen.

Diese Lösung finde ich sehr gut, danke dir für deine Hilfe, das ist sehr viel einfacher als meins :)

Das Problem mit dem Abschnitt vergleichen bleibt aber trotzdem. Ich habe den String nun erweitert und lasse nur bis zu dem Punkt suchen wo ich es haben will, da alles was nicht Ende ist ja erkannt und bestätigt wird das es gleich ist. Nicht optimal aber solange es funktioniert ist das ok.

Schreibt mir dennoch gerne noch Lösungen für das Problem, da meine Lösung sicher nicht immer gehen wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...