通过c中给定的字符串找出常量值

通过c中给定的字符串找出常量值,c,string,C,String,是否需要检查给定的字符串常量值(int/long/double) 这里strtol函数用于查找常量值。但面临的问题 例如: if(li1 = strtol (str,NULL,0)) printf("valid Integer ..."); str=“1”output=1.00 str=“0.99999”output=0.00 str=“tab”output=0.00 然后,如何通过查看输出来区分“0.99999”和“tab”?对于整数,提供了第二个参数,该参数将被设置为指

是否需要检查给定的字符串常量值(int/long/double)

这里strtol函数用于查找常量值。但面临的问题

例如:

   if(li1 = strtol (str,NULL,0))
       printf("valid Integer ...");
  • str=“1”
    output=1.00
  • str=“0.99999”
    output=0.00
  • str=“tab”
    output=0.00
  • 然后,如何通过查看输出来区分“0.99999”和“tab”?

    对于整数,提供了第二个参数,该参数将被设置为指向第一个不可转换字符

    如果是空终止符
    \0
    之外的任何东西,那么数字的末尾就是垃圾。如果它等于原始字符串,则找不到合适的字符

    例如:

    char *str = "72";
    
    char *estr;
    float val = strtol (str, &estr, 10);
    if (estr == str) {
        // there was no convertible characters.
    }
    if (*estr != '\0') {
        // there was rubbish at the end.
    }
    if (errno != 0) {
        // underflow/overflow.
    }
    
    对于浮点,您需要使用其中一个函数

    它的作用与strtol功能非常相似

    用法示例:

    char *str = "0.9999";
    
    char *estr;
    float val = strtof (str, &estr);
    if (estr == str) {
        // there was no convertible characters.
    }
    if (*estr != '\0') {
        // there was rubbish at the end.
    }
    if (errno != 0) {
        // underflow/overflow.
    }
    

    下面完整的程序中显示了一个计算字符串所代表类型的函数:

    #include <stdio.h>
    #include <stdlib.h>
    #include <inttypes.h>
    
    #define TYP_INTEGRAL 0
    #define TYP_FLOATING 1
    #define TYP_BAD      2
    int getTypeAndData (char *str, long *valL, float *valF) {
        char *end;
    
        *valL = strtol (str, &end, 10);
        if ((end != str) && (*end == '\0'))
            return TYP_INTEGRAL;
    
        *valF = strtof (str, &end);
        if ((end != str) && (*end == '\0'))
            return TYP_FLOATING;
    
        return TYP_BAD;
    }
    
    int main (int argc, char *argv[]) {
        char *desc[] = {"INT", "FLT", "BAD"};
        int i, typ;
        long lvar;
        float fvar;
        for (i = 1; i < argc; i++) {
            lvar = 0; fvar = 0;
            typ = getTypeAndData (argv[i], &lvar, &fvar);
            printf ("%s: [%-10s] %10ld %10.3f\n", desc[typ], argv[i], lvar, fvar);
        }
        return 0;
    }
    
    您可以看到,它正在检测至少我可以很快找到的单元测试用例

    请注意,这不会直接传达下溢和上溢情况。在这些情况下会返回默认值,因为它们通常是合理的选项,但如果要捕获这些条件,可以在返回后检查
    errno

    对于整数,提供第二个参数,该参数将设置为指向第一个不可转换字符

    如果是空终止符
    \0
    之外的任何东西,那么数字的末尾就是垃圾。如果它等于原始字符串,则找不到合适的字符

    例如:

    char *str = "72";
    
    char *estr;
    float val = strtol (str, &estr, 10);
    if (estr == str) {
        // there was no convertible characters.
    }
    if (*estr != '\0') {
        // there was rubbish at the end.
    }
    if (errno != 0) {
        // underflow/overflow.
    }
    
    对于浮点,您需要使用其中一个函数

    它的作用与strtol功能非常相似

    用法示例:

    char *str = "0.9999";
    
    char *estr;
    float val = strtof (str, &estr);
    if (estr == str) {
        // there was no convertible characters.
    }
    if (*estr != '\0') {
        // there was rubbish at the end.
    }
    if (errno != 0) {
        // underflow/overflow.
    }
    

    下面完整的程序中显示了一个计算字符串所代表类型的函数:

    #include <stdio.h>
    #include <stdlib.h>
    #include <inttypes.h>
    
    #define TYP_INTEGRAL 0
    #define TYP_FLOATING 1
    #define TYP_BAD      2
    int getTypeAndData (char *str, long *valL, float *valF) {
        char *end;
    
        *valL = strtol (str, &end, 10);
        if ((end != str) && (*end == '\0'))
            return TYP_INTEGRAL;
    
        *valF = strtof (str, &end);
        if ((end != str) && (*end == '\0'))
            return TYP_FLOATING;
    
        return TYP_BAD;
    }
    
    int main (int argc, char *argv[]) {
        char *desc[] = {"INT", "FLT", "BAD"};
        int i, typ;
        long lvar;
        float fvar;
        for (i = 1; i < argc; i++) {
            lvar = 0; fvar = 0;
            typ = getTypeAndData (argv[i], &lvar, &fvar);
            printf ("%s: [%-10s] %10ld %10.3f\n", desc[typ], argv[i], lvar, fvar);
        }
        return 0;
    }
    
    您可以看到,它正在检测至少我可以很快找到的单元测试用例


    请注意,这不会直接传达下溢和上溢情况。在这些情况下会返回默认值,因为它们通常是合理的选项,但是,如果您想了解这些情况,您可以在返回后检查
    errno

    如果您可能正在处理浮动,为什么不
    strtof
    strtod
    呢?如果您可能正在处理浮动,为什么不
    strtof
    strtod
    呢?我希望我可以+2-一个用于一篇伟大的文章,一个用于术语“wetware”在前两个函数中,您可能需要对照特定的值检查
    errno
    ,以确保它不是从以前的函数中设置的(尽管我认为如果是调用方,应该处理错误并手动重置它吗?),谢谢您的回复。但它不适用于以下测试用例1。10L==>浮动常数2。10xyz==>不是一个constant@ashwini,这是因为根据
    strtoX
    规则,
    10L
    不是有效的整数或浮点(尽管它在C源代码中有效)。如果您想接受strtoX范围之外的有效数字,那么您的代码将复杂得多。这是可行的,但仅使用这些函数是不行的(最好的办法可能是预处理字符串以删除拖尾
    L/LL/UL/ULL/etc)。我建议打开一个单独的问题,询问一个函数来实现这一点(并指定“您需要的一切”)。至于
    10xyz`,这在C中作为常量也是无效的,所以我不知道你为什么要接受它。我希望我能+2-一个用于一篇好文章,一个用于术语“wetware”。在前两篇文章中,你可能需要对照特定的值检查
    errno
    ,以确保它不是从以前的函数中设置的(虽然我认为如果是调用方应该处理错误并手动重置它?)感谢您的回复。但是它不适用于以下测试用例1.10L==>浮点常量2.10xyz===>不是constant@ashwini,这是因为根据
    strtoX
    规则,
    10L
    不是有效的整数或浮点(虽然它在C源代码中是有效的)。如果您想接受strtoX范围之外的有效数字,您的代码会复杂得多。这是可行的,但不能仅使用这些函数(最好的办法可能是预处理字符串以删除尾随的
    L/LL/ULL/ULL/etc).我建议打开一个单独的问题,询问一个函数是否可以这样做(并指定“您需要的一切”)。至于
    10xyz`,这在C中甚至作为常量都是无效的,所以我不确定您为什么要接受它。