0

atoi(s) 関数の使用に問題があります。コマンド ライン引数を整数に変換しようとしていますが、atoi 関数から受け取る整数の動作がおかしいです。変換を保持している変数を確認したところ、正しい整数が保持されていますが、プログラムを実行すると、正常に機能しません。プログラムは 3 つの引数を受け入れます。プログラム自体、関数番号 (1-3)、および任意の整数。たとえば、コマンド ライン命令は lab4p2 3 10 のようになります。

機能:

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


//---------------------------------------------------------------------------
// Functions

// Sumation function adds all integers from 1 to the value.
int sumation(int x)
{
  int counter = 1;
  int value;
  while (counter < (x+1))
    {
      value += counter;
      counter++;
    }
  return value;
}

// Negation function returns the negation of the given value.
int negation(int x)
{
  int negator, value;

  negator = (x*2);
  value = (x - negator);
  return value;
}

// Square function returns the square of the input value.
int square(int x)
{
  int value;
  value = (x*x);
  return value;
}

//---------------------------------------------------------------------------

主要:

main(int argc, char *argv[])
{

  int inputval, functionval, value;
  double doubleval;

  functionval = atoi(argv[1]);

  inputval = atoi(argv[2]);
  doubleval = atof(argv[2]);

  printf("%i", functionval);
  printf("%i", inputval);

  if(argc != 3)
    {
      printf("%s", "Invalid amount of arguments! 3 expected. \n");
    }
  else if ((functionval < 1)||(functionval > 3))
    {
      printf("%s", "Invalid function value. Expected values: 1-3 \n");
    }
  else if (inputval != doubleval)
    {
      printf("%s", "Invalid value! Integer expected. \n");
    }
  else if (functionval = 1)
    {
      value = sumation(inputval);

      printf("%s", "The sum from 1 to the input value = ");
      printf("%d", value);
    }
  else if (functionval = 2)
    {
      value = negation(inputval);

      printf("%s", "%d", "The negation of the input value = ", value);
    }
  else if (functionval = 3)
    {
      value = square(inputval);

      printf("%s", "%d", "The square of the input value = ", value);
    }
  else
    {
      printf("%s", "Something is wrong!");
    }

}

すべてのエラー チェックは正常に機能しますが、関数 2 と 3 は (入力にもかかわらず) アクセスされず、関数 1 は間違った回答を表示します。問題が何であるかを知っている人はいますか?

ありがとう、マット

4

2 に答える 2

4
functionval = 1    assignment

functionval == 1   comparison

ところで、doubleval を取得するときにもタイプミスがあります 。別の変換関数で argv[2] を再度使用することは、argv[3] のタイプミスではなく、意図的なものであることがわかりました。変換エラーを気にする場合は、次のようなものを使用します。

errno = 0;
char* endptr;
long value = strtol(argv[2], &endptr, 10);
if (errno == ERANGE) {
  // Value was too big or too negative
} else if (endptr == argv[2] || errno == EINVAL) {
  // Not a number
} else if (endptr[0] != '\0') {
  // trailing characters.
}
// Value is OK.

これは、頻繁に使用する場合は、呼び出しやすいものにラップする価値があります。

于 2012-10-08T01:01:40.333 に答える
2
else if (functionval = 1)
else if (functionval = 2)
else if (functionval = 3)

する必要があります

else if (functionval == 1)
else if (functionval == 2)
else if (functionval == 3)

それ以外の場合は、比較ではなく代入を実行します。

于 2012-10-08T01:03:27.477 に答える