Formatiertes Einlesen: IRC Hostname
-
Hallo,
Ich habe folgenden Code:
#include <stdio.h> #include <stdlib.h> struct irc_hostname { char nickname[64]; char ident[64]; char host[128]; }; int main(int argc, char *argv[]) { /* eg. nickname!ident@host */ char hostname[]="blaaablaa!buubaa@the.master.of.blabla.net"; struct irc_hostname user; sscanf(hostname, "%[^ !]%[^ @]%[^ ]", &user.nickname, &user.ident, &user.host); printf("\n\nAusgabe:\n"); printf("Nickname: %s\n", user.nickname); printf("Ident: %s\n", user.ident); printf("Host: %s\n", user.host); system("PAUSE"); return 0; }
Das gibt dies hier aus:
Ausgabe: Nickname: blaaablaa Ident: !buubaa Host: @the.master.of.blabla.net Drücken Sie eine beliebige Taste . . .
Nun ich habe vorher schon versucht (Da ! und @ ja klare Trennzeichen eigentlich sind):
sscanf(hostname, "%[^ ]!%[^ ]@%[^ ]", &user.nickname, &user.ident, &user.host);
Das ergibt mir aber:
Ausgabe: Nickname: blaaablaa!buubaa@the.master.of.blabla.net Ident: Host: ► Drücken Sie eine beliebige Taste . . .
Falls nur die Variante 1 geht, würde es mich interessieren wie ich möglichst einfach das erste Zeichen (Sprich: Trennzeichen; ! oder @) entfernen kann.
Aber viel mehr interessiert mich, wieso das 2. Beispiel nicht geht.
Vielen Dank,
Gruss unix]newbie
-
Wenn du "&" Operator weglässt müsste es funktionieren!
sscanf(hostname, "%[^ ]!%[^ ]@%[^ ]", user.nickname, user.ident, user.host);
user.nickname, user.ident...
sind Arrays wenn du user.nickname als parameter mitgibst wird die Adresse auf das erste Element übergeben! Also brauchst du hier kein &!mfg hohesC
-
Hallo HohesC,
Danke für deine Hilfe, aber es funktioniert leider immernoch nicht, als Ausgabe kommt:
Ausgabe: Nickname: blaaablaa!buubaa@the.master.of.blabla.net Ident: Host: ►
Gruss Unix]Newbie
-
unix]newbie schrieb:
sscanf(hostname, "%[^ ]!%[^ @]%[^ ]", user.nickname, user.ident, user.host);
Seit wann versteht sscanf Reguläre Ausdrücke? Na egal auf jeden Fall fehlen die Format-Specifiers. Sollte "%s irgendwas %s" sein.
Kurt
-
Sers
ZuK schrieb:
unix]newbie schrieb:
sscanf(hostname, "%[^ ]!%[^ @]%[^ ]", user.nickname, user.ident, user.host);
Seit wann versteht sscanf Reguläre Ausdrücke? Na egal auf jeden Fall fehlen die Format-Specifiers. Sollte "%s irgendwas %s" sein.
KurtGeht imfall immernoch nicht ;). Habe jetzt das so gemacht %s[^ ]
gruss unix]newbie
-
Wie gesagt Ich glaube nicht dass dass sscanf reguläre Ausdrücke erlaubt.
Versuche einmalsscanf(hostname, "%s!%s@%s", user.nickname, user.ident, user.host);
Kurt
-
ZuK: Das war mein erster Versuch. Dein Vorschlag geht auch nicht :-(. Gruss unix]newbie
-
wie wärs mit strtok? beim ersten mal als trennzeichen das !, beim zweiten mal das @...
auf bald
oenone
-
hi, strtok kenne ich, will es aber mit sscanf lösen. Ich will wissen was da falsch ist. Denn strtok könnte ich auch.
Danke
-
Ausgeflippt habe noch nirgends gehört das sscanf sowas kann.
So funktionierts:#include <stdio.h> #include <stdlib.h> struct irc_hostname { char nickname[64]; char ident[64]; char host[128]; }; int main(int argc, char *argv[]) { /* eg. nickname!ident@host */ char hostname[]="blaaablaa!buubaa@the.master.of.blabla.net"; struct irc_hostname user; sscanf(hostname, "%[^!]!%[^@]@%s", &user.nickname, &user.ident, &user.host); printf("\n\nAusgabe:\n"); printf("Nickname: %s\n", user.nickname); printf("Ident: %s\n", user.ident); printf("Host: %s\n", user.host); return 0; }
output schrieb:
Ausgabe:
Nickname: blaaablaa
Ident: buubaa
Host: the.master.of.blabla.netMan lernt nie aus.
Kurt
-
http://www.cppreference.com/stdio/scanf.html
es sind keine richtigen regex aber immerhin was ähnliches.
-
Danke Leute.
rackwitz: Das war auch meine Referenz, aber ich hatte nicht wirklich einen Plan, wie ich das mit dem Hostnamen lösen sollte ;).
ZuK: Ist wohl so ;-). Ich habe auch daraus gelernt. Vielen Dank für deine Hilfe.
Gruss unix]newbie