查找字符串中整数的长度

时间:2015-03-12 01:01:31

标签: c file parsing pointers if-statement

如果我有一个类似的文本文件:

8f5 

我可以轻松使用strstr来解析值85。 就这样:

//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()

2 个答案:

答案 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()函数,因为你无法验证输入字符串,因为无法知道函数是否成功。