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.
    Kurt

    Geht 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 einmal

    sscanf(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.net

    Man 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


Anmelden zum Antworten