C - sscanf无法正常工作

时间:2011-10-25 09:05:08

标签: c scanf

我正在尝试使用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 个答案:

答案 0 :(得分:15)

sscanf期望%s标记为空格分隔(制表符,空格,换行符),因此您必须在字符串和:

之间留出空格

对于丑陋的黑客攻击你可以尝试:

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

会强制令牌与冒号不匹配。

答案 1 :(得分:5)

如果你不是特别使用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 :(得分:2)

在此处使用%[约定。请参阅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;
}

将“here:command:3”作为输出。