使用strtol解析整数数据并避免使用无效格式-C

因此,我想了解与输入有关使用strtol的大多数主题,但没有找到我要找的确切问题。

基本上,我必须在C(m-ary树)中构建一些数据结构,然后我们才能从文本文件的行中接收顶点的数据。

现在,例如,行号7表示顶点号5,并且该行必须仅包含正整数,包括零,仅由一个空格分隔,这些整数实际上是该行顶点的子代。

现在,我当然是使用strtol来获取整数值,然后遍历下一个值并接收它们,但是它并没有涵盖所有可能出现的情况。

该行可能无效,例如“ 1.2.3”无效,但是我的strtol将获得第一个值1,转到下一个值,将其视为0,这是错误的。

可能还会出现的另一个问题是数字不是整数而是类似-2.5的双精度数,然后再次将其视为2和0,这必须是无效输入的错误。

因此,我想使用strtok通过空格将整数字段拆分,然后在每个strtol上调用,但同样该行可能是2.5 3.5,并且strtol将其视为2 0 3 0,这是不正确的。

我不确定同时使用strtol和strtok是否如此优雅。

您能给我解释一些其他方法来很好地解决此问题吗?

假设: 1.行的最大长度为1024个字符。 2.每行表示一个顶点,每个值均由单个空格分隔。 我们不能假设的结果:1.值不一定有效,我们需要验证我们拥有的值是无符号整数。例如,输入“ 1.2.3”无效。 2.可能在一行中出现重复的顶点,并且该顶点被视为无效输入。从文件等进行读取的整个过程必须适合Windows和Linux。如果输入无效,我们必须打印到标准错误“ Invalid input \ n”并返回EXIT_FAILURE值。

zhchea 回答:使用strtol解析整数数据并避免使用无效格式-C

  

该行可能无效,例如“ 1.2.3”无效,但是我的strtol将获得第一个值1,转到下一个值,将其视为0,这是错误的。

endptrstrtol的第二个参数)将告诉您您的输入存在问题(因为没有消耗任何输入,并且endptr没有进行高级输入)。发出错误消息。

  

可能还会出现的另一个问题是数字不是整数而是类似-2.5的双精度数,然后再次将其视为2和0,这必须是无效输入的错误。

双精度有效输入吗?然后使用strtod。如果只允许使用整数,请参阅第一点-检查endptr并发出错误消息。

,

策略:

  1. 删除尾随回车符和/或换行符。
  2. 使用strspn测试有效字符。
  3. 使用strstr测试一个以上的空格。
  4. 使用strtol解析值。

代码:

while ( fgets ( row,sizeof row,file)) {
    row[strcspn ( row,"\r\n")] = 0;//remove trailing carriage return and or newline
    size_t index = strspn ( row," 0123456789");//find index of non-matching character
    if ( row[index]) {//not the terminating zero
        exit ( EXIT_FAILURE);
    }
    if ( strstr ( row,"  ")) {//only single spaces allowed
        exit ( EXIT_FAILURE);
    }
    char *last = row;
    char *item = row;
    while ( *last) {//not the terminating zero
        long int value = strtol ( item,&last,10);
        if ( item == last) {
            break;
        }
        printf ( "%ld\n",value);
        item = last;
    }
}
本文链接:https://www.f2er.com/3081709.html

大家都在问