我如何使用sscanf与/分隔符获取整数

时间:2018-11-08 18:11:51

标签: c scanf

我有这个字符串" Running OnAirSegmentProgress: 1610/15464 "。 如何提取int之前的sscanf中的第一个"/" 注意到这个整数是周期性变化的吗?

3 个答案:

答案 0 :(得分:1)

这只是一个快速的解决方案,但它可以工作:

int main(void)
{
    int firstNum = 0, secondNum = 0;
    char string[100] = "Running OnAirSegmentProgress: 1610/15464";
    sscanf(string, "%*s %*s %d/%d", &firstNum, &secondNum);
    printf("%d\n", firstNum);
    return 0;
}

答案 1 :(得分:1)

检查此示例。

#include <stdio.h>
int main(void)
{
    char str[100]="Running OnAirSegment Progress: 1610/15464";
    int value,none;
    sscanf ( str, "%*[a-z A-Z: ] %d/%d", &value,&none);
    printf("%d %d",value,none);
    return 0;
}

答案 2 :(得分:1)

从包含整数的非数字字符的字符串中读取第一个整数值的最健壮的 format字符串之一可能是使用由以下字符组成的 character class 赋值抑制运算符 '*'组合在一起的任何非数字字符,以读取并丢弃所有非数字字符,直到第一个数字为止

    "%*[^0-9] %d"

通过这样做,您消除了对所需字符之前或之后的字符的任何依赖。 (只要数字不能出现在整数值的第一个数字之前)

此外,在使用sscanf时,您必须 检查退货,以确认预期的实际转化次数确实发生了,然后您才能放心有有效的数据。在所有转化中都养成习惯。如果您没有进行验证,那么您只是通过运气或意外事故进行编程。不要在编码中依靠机会-验证。

一个简短的例子是:

#include <stdio.h>

int main (void) {

    char *s = "  Running OnAirSegmentProgress: 1610/15464 ";
    int wanted;

    if (sscanf (s, "%*[^0-9] %d", &wanted) == 1)
        printf ("integer: %d\n", wanted);
    else
        fputs ("error: failed to parse integer.\n", stderr);

    return 0;
}

使用/输出示例

$ ./bin/parse1stint
integer: 1610

仔细检查一下,如果还有其他问题,请告诉我。