C - Sscanf не работает - PullRequest
       2

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

12 голосов
/ 25 октября 2011

Я пытаюсь извлечь строку и целое число из строки, используя 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 ведет себя так? Заранее благодарим вас за помощь!

Ответы [ 3 ]

15 голосов
/ 25 октября 2011

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

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

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

, что заставит токен не совпадать с двоеточием.

5 голосов
/ 25 октября 2011

Если вы не особо разбираетесь в использовании 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);

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

2 голосов
/ 25 октября 2011

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

, которая выдает «здесь: команда: 3» в качестве вывода.

...