代码之家  ›  专栏  ›  技术社区  ›  monksy

字符串中的非整数并使用ATOI

  •  2
  • monksy  · 技术社区  · 14 年前

    如果字符串中有非数字字符,并且您调用atoi[我假设wtoi也会这样做]。Atoi将如何处理字符串?

    例如,我有以下字符串:

    1. “20234543”
    2. “222B”
    3. “B”

    我确信1将返回整数20234543。我好奇的是2是否会返回“232”。[这就是我需要解决的问题]。另外3不应返回值。这些信仰是假的吗?也。。。如果2确实如我所相信的那样,它如何处理字符串末尾的e字符?[通常用指数表示法]

    6 回复  |  直到 6 年前
        1
  •  7
  •   Mike    14 年前

    你可以自己测试这类东西。我从 Cplusplus 参考站点。看起来你对前两个例子的直觉是正确的,但第三个例子返回“0”。“e”和“e”的处理方式与第二个示例中的“b”相同。

    所以规则是

    函数成功后,将转换后的整数作为int值返回。 如果无法执行有效的转换,则返回零值。 如果正确的值超出了可表示值的范围,则返回int_max或int_min。

        2
  •  9
  •   Alok Singhal    14 年前

    根据标准,“功能 atof , atoi , atol atoll 不需要影响整数表达式的值 errno 一个错误。如果结果的值无法表示,则行为是未定义的。”(7.20.1, 数字转换函数 在C99)。

    所以,从技术上讲,任何事情都可能发生。即使是第一个案例,从 INT_MAX 保证至少有32767个,而且自20234543年以来,它也可能失败。

    为了更好地检查错误,请使用 strtol :

    const char *s = "232B";
    char *eptr;
    long value = strtol(s, &eptr, 10); /* 10 is the base */
    /* now, value is 232, eptr points to "B" */
    
    s = "20234543";
    value = strtol(s, &eptr, 10);
    
    s = "123456789012345";
    value = strtol(s, &eptr, 10);
    /* If there was no overflow, value will contain 123456789012345,
       otherwise, value will contain LONG_MAX and errno will be ERANGE */
    

    如果需要解析其中包含“e”(指数表示法)的数字,那么应该使用 strtod . 当然,这些数字是浮点的,而且 字符串转换为浮点数 收益率 double . 如果要从中生成整数,可以在检查正确的范围后进行转换。

        3
  •  3
  •   pcent    14 年前

    如果atoi遇到一个非数字字符,它将返回到该点之前形成的数字。

        4
  •  3
  •   moonshadow    6 年前

    atoi 从缓冲区读取数字,直到它不能再读取为止。当它遇到任何不是数字的字符时,它就会停止,除了空格(它跳过)或“+”或“-”之外,在它看到任何数字之前(它用来为结果选择适当的符号)。如果没有看到数字,则返回0。

    因此,要回答您的具体问题:1返回20234543。2返回232。3返回0。字符“e”不是空格、数字、“+”或“-”,因此如果遇到该字符,atoi将停止并返回。

    也见 here .

        5
  •  0
  •   J. Fernwright    6 年前

    我尝试在一个项目中使用atoi(),但是如果在组合中有任何非数字字符,它们就会出现,那么它将不起作用。 之前 数字字符-将返回零。好像不介意他们来 之后 数字,不管什么原因。

    这里有一个非常简单的字符串到in t转换器,我写过,它似乎没有这个问题(简单来说,它不适用于负数,也不包含任何错误处理,但在特定的情况下可能会有所帮助)。希望它能有所帮助。

    int stringToInt(std::string newIntString)
    {
        unsigned int dataElement = 0;
        unsigned int i = 0;
    
        while ( i < newIntString.length())
        {
            if (newIntString[i]>=48 && newIntString[i]<=57)
            {
             dataElement += static_cast<unsigned int>(newIntString[i]-'0')*(pow(10,newIntString.length()-(i+1)));
            }
            i++;
        }
        return dataElement;
    }
    
        6
  •  -1
  •   dash-tom-bang    14 年前

    写一些简单的代码,看看它能做些什么,这很神奇,也很有启发性。

    在第3点,它不会返回“无”。它不会返回。它会返回一些东西,但这些东西对您不会有用。

    http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

    函数成功后,将转换后的整数作为int值返回。

    如果无法执行有效的转换,则返回零值。

    如果正确的值超出了可表示值的范围,则返回int_max或int_min。