Vraag C - sscanf werkt niet


Ik probeer een tekenreeks en een geheel getal uit een tekenreeks te halen met sscanf:

#include<stdio.h>

int main()
{
    char Command[20] = "command:3";
    char Keyword[20];
    int Context;

    sscanf(Command, "%s:%d", Keyword, &Context);

    printf("Keyword:%s\n",Keyword);
    printf("Context:%d",Context);

    getch();
    return 0;
}

Maar dit geeft me de output:

Keyword:command:3
Context:1971293397

Ik verwacht deze uitgang:

Keyword:command
Context:3

Waarom doet sscanf gedraagt ​​zich als dit? Bij voorbaat dank voor uw hulp!


11
2017-10-25 09:05


oorsprong


antwoorden:


sscanf verwacht de %s tokens als witruimte gescheiden (tab, spatie, nieuwe regel), dus je moet een spatie hebben tussen de tekenreeks en de:

voor een lelijk uitziende hack kun je het proberen:

sscanf(Command, "%[^:]:%d", Keyword, &Context);

waardoor het token niet overeenkomt met de dubbele punt.


15
2017-10-25 09:11



Als je niet bepaald geïnteresseerd bent in het gebruik van sscanf, kun je altijd strtok gebruiken, want wat je wilt is om je string te tokeniseren.

    char Command[20] = "command:3";

    char* key;
    int val;

    key = strtok(Command, ":");
    val = atoi(strtok(NULL, ":"));

    printf("Keyword:%s\n",key);
    printf("Context:%d\n",val);

Dit is naar mijn mening veel leesbaarder.


5
2017-10-25 09:27



gebruik een %[ conventie hier. zie de handleiding van scanf: http://linux.die.net/man/3/scanf

#include <stdio.h>

int main()
{
    char *s = "command:3";
    char s1[0xff];
    int d;
    sscanf(s, "%[^:]:%d", s1, &d);
    printf("here: %s:%d\n", s1, d);
    return 0;
}

die "here: command: 3" als uitvoer geeft.


2
2017-10-25 09:22