如果我有一个类似的文本文件:
8f5
我可以轻松使用strstr
来解析值8
和5
。
就这样:
//while fgets.. etc (other variables and declarations before it)
char * ptr = strstr(str,"f");
if(ptr != NULL)
{
int a = atol(ptr-1); // value of 8
int b = atol(ptr+1); // value of 5
}
但是如果两位小数的值很长怎么办?我可以add +2 and -2
给每个atol电话。但我无法预测这些值何时小于10或更大,例如
12f6
或15f15
因为这些值每次都是随机的(即一个小数或两个)。有没有办法检查字符串之间的值的长度,然后使用atol()
?
答案 0 :(得分:1)
如果我正确地阅读了问题,请使用atol(str)
和atol(ptr+1)
。这将获得由f分隔的两个数字,无论它们有多长。
如果您不希望依赖垃圾字符阻止atol解析这一事实,请先设置*ptr = '\0'
。
答案 1 :(得分:1)
如果文本总是与您发布的文本类似,那么您可以使用以下代码获取字符串的三个部分,如果它们之间有空格,您可以解析另一个标记
#include <ctype.h>
#include <stdio.h>
int main(void)
{
char string[] = "12f5 1234x2912";
char *next;
next = string;
while (*next != '\0') /* While not at the end of the string */
{
char separator[100];
size_t counter;
int firstNumber;
int secondNumber;
/* Get the first number */
firstNumber = strtol(next, &next, 10);
counter = 0;
/* Skip all non-numeric characters and store them in `separator' */
while ((*next != '\0') && (isdigit(*next) == 0))
separator[counter++] = *next++;
/* nul terminate `separator' */
separator[counter] = '\0';
/* extract the second number */
secondNumber = strtol(next, &next, 10);
/* show me how you did it */
printf("%d:%s:%d\n", firstNumber, separator, secondNumber);
/* skip any number of white space characters */
while ((*next != '\0') && (isspace(*next) != 0))
next++;
}
}
在上面的示例中,您可以看到要解析的字符串,您可以阅读strtol()
手册页以了解此算法的工作原理。
通常你不应该使用atoi()
或atol()
函数,因为你无法验证输入字符串,因为无法知道函数是否成功。