我有这个字符串" Running OnAirSegmentProgress: 1610/15464 "
。
如何提取int
之前的sscanf
中的第一个"/"
注意到这个整数是周期性变化的吗?
答案 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
仔细检查一下,如果还有其他问题,请告诉我。