C-sscanf 不工作

发布于 2024-12-11 22:02:47 字数 515 浏览 1 评论 0原文

我正在尝试使用 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 的行为像这样?预先感谢您的帮助!

I'm trying to extract a string and an integer out of a string using 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;
}

But this gives me the output:

Keyword:command:3
Context:1971293397

I'm expecting this ouput:

Keyword:command
Context:3

Why does sscanf behaves like this? Thanks in advance you for your help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

sscanf 期望 %s 标记以空格分隔(制表符、空格、换行符),因此在字符串和 : 之间必须有一个空格,

这样会显得丑陋您可以尝试寻找 hack:

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

这将强制令牌与冒号不匹配。

sscanf expects the %s tokens to be whitespace delimited (tab, space, newline), so you'd have to have a space between the string and the :

for an ugly looking hack you can try:

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

which will force the token to not match the colon.

月朦胧 2024-12-18 22:02:47

如果您不特别喜欢使用 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);

在我看来,这更具可读性。

If you aren't particular about using sscanf, you could always use strtok, since what you want is to tokenize your string.

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

This is much more readable, in my opinion.

触ぅ动初心 2024-12-18 22:02:47

此处使用 %[ 约定。请参阅 scanf 的手册页: http://linux.die.net/man/3/scanf< /a>

#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”作为其输出。

use a %[ convention here. see the manual page of 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;
}

which gives "here:command:3" as its output.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文