Zeichenkette "abschneiden"
-
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 ausstring.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!
-
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)?