1

4 つのコマンドライン引数を 4 つの int に入れようとしています。最初の引数では機能しますが、残りの引数では 0 を返します。何が間違っているのかわかりません。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
    char* pEnd;
    long li1, li2, li3, li4;
    li1 = strtol(argv[1],&pEnd,10);
    li2 = strtol(pEnd,&pEnd,10);
    li3 = strtol(pEnd,&pEnd,10);
    li4 = strtol(pEnd,NULL,10);

たとえば、プログラムを として実行すると./a.out -5 5 3 9、解析された値は-5 0 0 0.

4

2 に答える 2

2

引数を与えます-5 5 3 9。この意味は

  • argv[1]含む"-5"
  • argv[2]含む"5"
  • argv[3]含む"3"
  • argv[4]含む"9"

あなたが使う

li1 = strtol(argv[1],&pEnd,10);

そして今、空の文字列をli1含み-5pEnd保持します。""以下のステートメントは失敗strtolし、空の文字列から数値を抽出できなかったため、 0 を返します。pEnd

li2 = strtol(pEnd,&pEnd,10);
li3 = strtol(pEnd,&pEnd,10);
li4 = strtol(pEnd,NULL,10);

この問題を解決するには、次を使用できます

li1 = strtol(argv[1], NULL, 10);
li2 = strtol(argv[2], NULL, 10);
li3 = strtol(argv[3], NULL, 10);
li4 = strtol(argv[4], NULL, 10);

pEnd不要なので取り除きます。

別の方法は、@BLUEPIXY が提案したことを実行することです。つまり、引数を二重引用符で囲み、thing( -5 5 3 9) 全体が単一の引数になり、argv[1]保持されるようにします"-5 5 3 9"。これを行うと、コードは期待どおりに機能します。

于 2015-03-30T14:02:07.193 に答える
1

問題は、各数値が単一の引数として渡されるため、実際にはこれで目的が達成されることです。

long li1, li2, li3, li4;

li1 = strtol(argv[1], &pEnd, 10);
li2 = strtol(argv[2], &pEnd, 10);
li3 = strtol(argv[3], &pEnd, 10);
li4 = strtol(argv[4], &pEnd, 10);

ここpEndで、プログラムが間違った入力値で呼び出される可能性があることを忘れずに、入力値の有効性を確認するためにチェックできます。

if (*pEnd != '\0')
 {
    fprintf(stderr, "error: invalid input ... \n");
 }

長期的には多くの問題を防ぐことができます。

エラーチェックを省略することは、c プログラマーが明らかにする最も一般的な間違いの 1 つです。おそらく、c で行うのは面倒だからです。しかし、それは必要がないという意味ではありませ

コードを機能させたい場合は、4 つの数値を単一の引数にする必要があります。これは、数値をダブル/シングル クォート""/で囲むことで実現できます''

于 2015-03-30T14:00:24.280 に答える