Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

Gelöst von Gast D-eath

Zur Lösung

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

  • Lösung

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++;
    }
}

 

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_

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.

  • Autor

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

  • Autor
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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.