C - sscanf не работает

Я пытаюсь извлечь строку и целое число из строки с помощью 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;
}

Но это дает мне результат:

Keyword:command:3
Context:1971293397

Я ожидаю этого вывода:

Keyword:command
Context:3

Почему sscanf ведет себя так? Заранее благодарю вас за вашу помощь!

Ответ 1

sscanf ожидает, что токены %s будут разделены пробелами (вкладка, пробел, новая строка), поэтому вам нужно иметь пробел между строкой и:

для уродливого вида взлома вы можете попробовать:

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

который заставит токен не соответствовать двоеточию.

Ответ 2

Если вы не особенно разбираетесь в использовании sscanf, вы всегда можете использовать strtok, так как вы хотите, чтобы токенизировать вашу строку.

    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);

Это гораздо более читаемо, на мой взгляд.

Ответ 3

используйте соглашение %[ здесь. см. страницу руководства 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;
}

который дает здесь: command: 3 ".