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 4不是我预期的数组。如何存储int数组argv然后打印出来?

4

2 回答 2

2

应该:

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

记住命令行参数是字符串。因此,即使您在命令行中传递了一个整数,它也是一个需要转换为整数的字符串。

于 2015-04-22T18:46:13.003 回答
2

argv是一个指向字符串的指针数组;参数不是整数,它们是包含 ASCII 字符的以空字符结尾的字符串;如果要将它们解释为整数值,则需要执行转换:

考虑:

#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 回答