Zeichenkette "abschneiden"



  • ja so ähnlich, wie gesagt ich möchte den Teil dann in einem neuen Array speichern und nicht ausgeben...

    so quasi:

    #include <stdio.h>
    #include <string.h>
    
    int main ()
    {
        char rcv_buf[512] = "jdskla u843 ujdfnfgv 8945zt8vfdjk 85u8nfg8u ifjv438 ut3 PW=nfdg 349 dfjgn8348";
        char *pos = strstr(rcv_buf, "PW=");
    	char str[20];
        puts(pos);
    
    	sscanf(pos,"PW=%s", str);
    	printf(str);
        getchar();
    }
    

    nur, ist das effizient, oder löst ein erfahrener Programmierer so etwas edler?


  • Mod

    Du möchtest also nur und genau die Zeichen nach "PW=" bis zum nächsten Whitespace?



  • SeppJ schrieb:

    Du möchtest also nur und genau die Zeichen nach "PW=" bis zum nächsten Whitespace?

    genau 🙂



  • JeanClaudeMagnum schrieb:

    nur, ist das effizient, oder löst ein erfahrener Programmierer so etwas edler?

    scanf ist schon eine edle Funktion. Sie macht das, was du möchtest.

    Allerdings ist sie auf einem (8-Bit)µC recht teuer (Speicherverbrauch).
    Da würde man es dann anders lösen.
    Du kannst was mit den Standardfunktionen aus string.h basteln, allerdings ist das kopieren von ein paar Zeichen auch kein Aufwand.

    #include <ctype.h>
    ...
    char *ctmp;
    ...
    pos = strstr(......
    
    ctmp = str;                  // Ziel
    pos += 3;                    // hinter dem PW= anfangen
    while(!isspace(*pos)&&*pos)  // solange es kein Whitespace ist und kein Stringende ist
      *cmtp++ = *pos++;          // kopieren und weiterzählen
    
    *ctmp = '\0';                // Stringende markieren
    

    Du musst mal schauen, ob !isspace() überhaubt das richtige Kriterium für dich ist. Schau mal was bei ctype nocht mit dabei ist.



  • #include <stdio.h>  // printf
    #include <string.h> // strstr, strcspn, memcpy
    
    #define min(a,b) (a < b ? a : b)
    
    // Program entry
    int main(){
        // Declarations
        char *pw_buf_start, pw[20];
        size_t pw_len;
        // Received buffer
        char rcv_buf[] = "jdskla u843 ujdfnfgv 8945zt8vfdjk 85u8nfg8u ifjv438 ut3 PW=nfdg 349 dfjgn8348";
        // Found a password?
        pw_buf_start = strstr(rcv_buf, "PW=");
        if(pw_buf_start){
            // Skip password identifier
            pw_buf_start += 3;
            // Get password length
            pw_len = min(sizeof(pw)-1, strcspn(pw_buf_start, " \t\n\r"));
            // Copy password
            memcpy(pw, pw_buf_start, pw_len);
            pw[pw_len] = '\0';
            // Output password
            printf(pw);
        }
    }
    


  • Super, funktioniert! Vielen Dank an alle!


  • Mod

    Youka schrieb:

    // Get password length
            pw_len = min(sizeof(pw)-1, strcspn(pw_buf_start, " \t\n\r"));
            // Copy password
            memcpy(pw, pw_buf_start, pw_len);
    

    Gefällt mir nicht. Erst gehen wir alles durch und zählen mit, bis wir das Ende gefunden haben. Dann springen wir zurück und gehen alles durch, um es zu kopieren. Warum nicht in einem Rutsch durchgehen und kopieren, bis wir das Ende gefunden haben?



  • Zudem wird pw_len hier gar nicht geprüft. Wenn pw_len in dem Fall > 20 ist, wäre das höchst unschön...

    Maximale Performance wäre sicherlich deine Variante, allerdings muss man davor wissen, wieviel Zeichen maximal zu entnehmen sind und das Zielarray schon vorher entsprechend groß anlegen.



  • SeppJ schrieb:

    Warum nicht in einem Rutsch durchgehen und kopieren, bis wir das Ende gefunden haben?

    Zur Vollständigkeit war das die Variante mit string.h Funktionen, DirkBs Vorschlag ist natürlich effizienter, sollte allerdings noch die Größe des Ausgabebuffers berücksichtigen.

    It0101 schrieb:

    Zudem wird pw_len hier gar nicht geprüft. Wenn pw_len in dem Fall > 20 ist, wäre das höchst unschön...

    Dazu wird ja mit min die Größe auf den Ausgabebuffer angepasst...

    // Get password length
            pw_len = min(sizeof(pw)-1, strcspn(pw_buf_start, " \t\n\r"));
    


  • Achja, jetzt seh ichs auch ^^



  • Youka schrieb:

    // Output password
    printf(pw);
    

    Auch das würde ich mir noch mal überlegen. Warum nicht einfach puts(str)?


Anmelden zum Antworten