【问题标题】:Store argv to an int array将 argv 存储到 int 数组
【发布时间】:2015-04-23 03:17:36
【问题描述】:

我有这样的代码将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 数组。如何存储来自argvint 数组然后打印出来?

【问题讨论】:

  • 这些是作为 char 数组的参数的指针值。您应该使用strtolatoi 将参数字符串转换为整数,然后再将它们存储到int 数组中。
  • @MOehm :这是答案而不是评论;你应该发布一个答案。

标签: c arrays argv calloc argc


【解决方案1】:

应该是:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-04-17
      • 2016-01-22
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 2017-10-02
      • 2011-12-31
      相关资源
      最近更新 更多