0
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
        if(argc != 2)
                return 1;
        if(!atoi(argv[1]))
                printf("Error.");
        else printf("Success.");
        return 0;
}

当我输入一个低于或高于零值的参数时,我的代码有效。

[griffin@localhost programming]$ ./testx 1
Success.
[griffin@localhost programming]$ ./testx -1
Success.
[griffin@localhost programming]$ ./testx 0
Error.

为什么它不起作用?

4

3 回答 3

14

这很简单,atoi返回转换后的数字,在你的情况下是完全正确的0(如预期的那样)。

没有标准的方法来检查使用atoi.

由于您正在编写 c++,因此您可以通过使用std::istringstream, std::stoi(C++11) 或strtol(在处理任意数字时更好的接口)来获得相同的结果,并进行更好的错误检查。


std::istringstream 示例

#include <sstream>

  ...

std::istringstream iss (argv[1]);
int res;

if (!(iss >> res))
  std::cerr << "error";

std::strtol 示例

#include <cstdlib>
#include <cstring>

  ...

char * end_ptr;

std::strtol (argv[1], &end_ptr, 10);

if ((end_ptr - argv[1]) != std::strlen (argv[1]))
  std::cerr << "error";

标准::stoi (C++11)

#include <string>

  ...

int res;

try {
  res = std::stoi (argv[1]);

} catch (std::exception& e) {
  std::cerr << "error";
}
于 2012-06-18T12:54:42.500 回答
3

因为0在 C 中意味着false并且任何非零值都意味着true. 并atoi("0")返回 0,因此if语句分支到else子句。

于 2012-06-18T12:54:49.463 回答
1

手册页明确指出,无法atoi()检测到错误。它总是返回一个数字,在您的情况下是0.

所以你的代码评估if (!0)哪个是真的,因此它错误地指示一个错误。

没有选项可以进行错误处理,atoi()因此您应该strtoul()/strtol()改用。(例如参见手册页)。

于 2012-06-18T12:55:51.437 回答