如何使用sscanf通过/separator获取int

如何使用sscanf通过/separator获取int,c,scanf,C,Scanf,我在AirSegmentProgress:1610/15464上运行了这个字符串,。 如何在“/”之前使用sscanf提取第一个int 注意到这个整数是周期性变化的吗?这只是一个快速的解决方案,但它可以工作: int main(void) { int firstNum = 0, secondNum = 0; char string[100] = "Running OnAirSegmentProgress: 1610/15464"; sscanf(string, "%*s

我在AirSegmentProgress:1610/15464上运行了这个字符串
。 如何在
“/”之前使用
sscanf
提取第一个
int

注意到这个整数是周期性变化的吗?

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

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

这只是一个快速的解决方案,但它很有效:

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;
}
检查这个例子

#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;
}
#包括
内部主(空)
{
char str[100]=“运行航空段进度:1610/15464”;
int值,无;
sscanf(str,“%*[a-z a-z:]%d/%d”,&value,&none);
printf(“%d%d”,值,无);
返回0;
}
检查此示例

#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;
}
#包括
内部主(空)
{
char str[100]=“运行航空段进度:1610/15464”;
int值,无;
sscanf(str,“%*[a-z a-z:]%d/%d”,&value,&none);
printf(“%d%d”,值,无);
返回0;
}

从整数前面有非数字字符的字符串中读取第一个整数值最可靠的格式字符串之一可能是使用由任何非数字组成的字符类,并结合赋值抑制运算符
'*'
来读取和丢弃第一个整数值之前的所有非数字字符数字,例如

    "%*[^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;
}

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

从整数前面带有非数字字符的字符串中读取第一个整数值的最可靠的格式字符串之一可能是使用由任何非数字组成的字符类,并结合赋值抑制运算符
'*'
读取并丢弃第一个数字之前的所有非数字字符,例如

    "%*[^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;
}

仔细查看,如果您还有其他问题,请告诉我。

到目前为止您尝试了什么?是否只提取第一个、第一个和第二个,或者是由
/
分隔的任意整数序列?例如,在本例中,我只想提取1610等可能使用的/函数前面的第一个整数:
strchr
isdigit
sscanf
strtol
如何将其用于SSCA?到目前为止,您尝试了什么?是否只提取第一个、第一个和第二个,或者是由
/
分隔的任意整数序列?例如,在本例中,我只想提取1610等可能有用的/函数前面的第一个整数:
strchr
isdigit
sscanf
strtol
如何使用它sscanf@chux. 是的,你是对的。我编辑了。但是我留下了额外的空间。@chux。是的,你是对的。我编辑了。但是我留下了额外的空间。