【问题标题】:null in atoi converts the value to 0atoi 中的 null 将值转换为 0
【发布时间】:2014-07-21 09:59:26
【问题描述】:

在我的程序中,我有一个 char 数组(char data[]),我必须从中提取数据并将其存储在一个整数变量(值)中。为此,我在我的程序中使用了 atoi。问题是我有时会在 char 数组(数据)中收到 null。如果我在这个值上使用 atoi,我会在整数变量中得到值 0 而不是 (null)

真正的功能相当大,我不能在这里发布整个代码。从下面提到的功能,我希望你们能对我在这里做什么有所了解。

Get_Data(char data[])
{
    int value;
    value = atoi(p);
}

我最近读到我们应该使用 strtol 而不是 atoi。我也试过了。但我的变量值仍然为 0。

我想知道我应该使用哪个函数来获得 (null) 整数变量值?

这里的null是指空字符数组

请提供针对该问题的解决方案。在上面的函数中,如果 data 得到空 char 值,我如何确保我的 int 变量值也得到空值而不是零??

【问题讨论】:

  • 在 C/C++ 中,您不能将 null 存储在 int 变量中。
  • 当您说“null”时,您是指空字符数组还是字符串“null”?
  • @Holt 这取决于他所说的“null”是什么意思。您绝对可以在int 中存储一个空字符,并且在可能的系统上,您也可以在int 中存储一个空指针常量。
  • @doctorlove : 我的意思是空字符数组..你能建议任何解决方案吗
  • 先试试看字符串的长度?

标签: c++ c atoi strtol


【解决方案1】:

atoi 返回零

如果 str 中的第一个非空白字符序列不是 有效的整数,或者如果不存在这样的序列,因为 str 为空或仅包含空格字符,没有转换 执行并返回零。

此外,您返回 NULL 的要求是不可能的,因为您在 intint 中分配了这些值,而不是 NULL

【讨论】:

  • 除了在大多数机器上,int 可以容纳NULLNULL 是“空指针常量”,而不是空指针。
  • @JamesKanze 你在这个意义上说int *ptr = NULL; 对吗?
  • 有点。我真正想说的是int i = NULL; 是完全合法的,并且对于大多数编译器来说,甚至不会引发警告。 (g++ 是我所知道的唯一一个会发出警告的编译器。)
  • NULL 在大多数实现中被定义为 0。
  • @JamesKanze 你在谈论毫无意义的角落理论。一旦您将NULL 存储在int 中,它就变成了另一个数字,不再是NULL。在大多数理智的实现中,我们甚至知道这个数字是0。如果您知道您有 NULL 数据,并且这对您来说非常重要,请使用 if 声明,看在上帝的份上。 (哦,将NULL 传递给atoi()未定义,即使它可能会在99.9% 的时间返回0,它也可以SEGFAULT,所以是的......)跨度>
【解决方案2】:

因为atoi 会尽可能多地阅读。

你应该改用strtol,像这样:

char* endptr = NULL
char* myString = "OUPS";
long n = strtol(myString, &endptr, 10);

if (*endptr != '\0') {
  // ERROR
}

阅读参考链接以获得更多解释(以及示例)。

【讨论】:

【解决方案3】:

这不是很好吗?

C++ 中没有整数值拼写为null

整数形式的NULL仅为0。

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2015-01-11
    相关资源
    最近更新 更多