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++を書いているので、、(C ++ 11)または(任意の数を扱うときのより良いインターフェースです)を使用することで、より良いエラーチェックで同じ結果を得ることがstd::istringstreamできstd::stoiます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";

std :: 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

0Cはを意味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 に答える