如何设置sscanf()以忽略字符串开头的字符?

3
我有一个如下的字符串
 char row[]="11/12/1999 foo:bar some data..... ms:12123343 hot:32";

我想使用sscanf将'ms'的值插入到int变量中。但我不知道如何配置sscanf以忽略行中的第一个数据。我尝试了以下代码,但没有实现效果。
int i;
sscanf(row,".*ms:%d",i);

1
sscanf(strstr(row, "ms:") + 3, "%d", &i); - pmg
如果您知道只有一个冒号,您也可以使用 sscanf(row, "%*[^:]:%d", &i); - Daniel Fischer
没有其他冒号 - herzl shemuelian
@herzlshemuelian,请尝试我的答案,我也在那里给出了一个链接,打开第二个答案。 - Grijesh Chauhan
@GrijeshChauhan 谢谢,我已经回复了你的解决方案评论。 - herzl shemuelian
2个回答

5

我认为,与其使用sscanf()来忽略数据,最好使用另一个函数来获取您想要的字符串部分。

我建议使用strstr()函数。 例如:

#include <stdio.h>
#include <string.h>

int main(void) {
    char row[] = "11/12/1999 foo:54654 some data..... ms:12123343 hot:32";
    char *ms;
    int i;

    ms = strstr(row, "ms:");
    if (ms == NULL) /* error: no "ms:" in row */;
    if (sscanf(ms + 3, "%d", &i) != 1) /* error: invalid data */;
    printf("ms value is %d.\n", i);
    return 0;
}

您可以在ideone上查看代码运行


我的答案是针对C语言的。在C++中,您将使用string而不是字符数组,并可能采用不同的方法来解决问题:我不了解C ++。 - pmg
您可以查看此处的新代码版本,该版本接受来自stdin的输入:(http://ideone.com/RUtAPU)。 - pmg

0

在shell中,通常使用通配符,但是sscanf函数并不会将*字符作为通配符处理。

7.21.6.2 fscanf函数
— 可选的赋值抑制字符 *。

有几种解决方案。例如:

#include <stdio.h>
#include <string.h>

char *pend = strrchr(row, ':');
sscanf(pend, ":%d", &i);

你也可以使用scanfstrstr中的扫描集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接