1

argv動的に割り当てられたint配列に格納する次のようなコードがあります。

int *data;    // pointer to array of integer numbers
int size;     // size of data array

int main(int argc, char* argv[]) {
  // initialize array data
  size=argc;
  printf("%dSize=\n",size);
  printf("%d\n",argc);
  data=(int*)calloc(size,sizeof(int));
  int i=0;
  for (i=1;i<size;i++)
  {
   data[i]=argv[i];
   printf("%d\n",data[i]);
  }
  for (i=1;i<argc;i++)
  {
   printf("%d\n",argv[i]);
  }
  return 0;
}

コマンドラインで実行すると、次のよう ./sumprime 5 1 2 3 4 に出力されます。

6Size=
6
15311660
15311662
15311664
15311666
15311668
15311660
15311662
15311664
15311666
15311668

期待どおりの配列ではありません5 1 2 3 4int配列を保存してからargv印刷するにはどうすればよいですか?

4

2 に答える 2

2

argv文字列へのポインタの配列です。引数は整数ではなく、ASCII 文字を含む null で終了する文字列です。それらを整数値として解釈したい場合は、変換を実行する必要があります。

検討:

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

int main(int argc, char** argv ) 
{
    int size = argc - 1 ;
    int* data  = (int*)calloc( size, sizeof(int) ) ;

    printf( "Size = %d\n", size ) ;

    // For each argument...
    for( int i = 0; i < size; i++)
    {
        // convert string to an integer
        sscanf( argv[i + 1], "%d", &data[i] ) ;

       // Output the argument string and its converted value
        printf( "\"%s\" -> %d\n", argv[i + 1], data[i] ) ; 
    }

    return 0;
}

あなたの入力に対して、出力は次のとおりです。

Size = 5
"5" -> 5
"1" -> 1
"2" -> 2
"3" -> 3
"4" -> 4

呼び出したときに何が起こるかを確認することは、おそらく有益です。

./sumprime 5 1 hello 3 4

次の出力が得られます。

Size = 5
"5" -> 5
"1" -> 1
"hello" -> 0
"3" -> 3
"4" -> 4
于 2015-04-22T19:12:23.733 に答える
2

次のようにする必要があります。

   data[i]=atoi(argv[i]);

コマンドライン引数は文字列であることを忘れないでください。したがって、コマンドラインで整数を渡しても、整数に変換する必要がある文字列です。

于 2015-04-22T18:46:13.003 に答える