转换命令行参数数组并将其存储在int数组中

时间:2019-02-26 18:19:57

标签: c arrays heap-memory

我正在编写一个程序,该程序从命令行(例如10 20 30 40)获取参数数组,将其转换为整数,然后将其保存到int数组中,以备后用。我已经声明了堆的指针。我想将CL中的数字计数存储在length变量中。然后为该长度分配空间,并将其复制到堆中。接下来,使用一个将命令行参数转换为整数并将其复制到int数组中的函数,我对如何传递命令行值感到困惑。有人可以指出我正确的方向吗?谢谢。

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

void convert(char** source, int length);

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

  int length = 0;
  char *p_heap;

  if( argc > 11 || argc < 2 ) {
    printf("arguments 1-10 are accepted %d provided\n", argc-1);
    printf("Program Name Is: %s",argv[0]); 
    exit(EXIT_FAILURE);
  }

  length = argc-1;
  p_heap = malloc(sizeof(length));
  strcpy(p_heap, length);
  convert(p_heap, length);

  //printf("Average %f\n", avg());

  puts(p_heap);
  free(p_heap);

  return 0;
}

void convert(char** source, int length){

  int *dst;
  int i;

  for(i=0;i<length;i++) {
    dst = atoi([i]); 
  } 


}

3 个答案:

答案 0 :(得分:1)

注意:我假设来自CL的输入正确。

  

我想将CL中的数字计数存储在length变量中。

如果您假设来自CL的输入正确,那么您在createContext中就有这个数字。

  

然后为该长度分配空间并将其复制到堆中。

argc-1
  

接下来,使用将命令行参数转换为整数并将其复制到int数组中的函数。

dst = malloc((argc-1)*sizeof *dst);

还应该将for(int i=0; i<argc-1; i++) sscanf(source[i], "%d", &dst[i]); 的返回类型更改为convert,然后返回int *

答案 1 :(得分:0)

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

int main(int argc, char **argv)
{
    if (argc == 1)
        return EXIT_SUCCESS;

    long *data = malloc((argc - 1) * sizeof *data);

    for (int i = 1; i < argc; ++i) {
        char *endptr;

        errno = 0;
        data[i-1] = strtol(argv[i], &endptr, 10);

        if (*endptr != '\0') {
            fputs("Input error :(", stderr);
            return EXIT_FAILURE;
        }

        if (errno == ERANGE) {
            fputs("Parameter out of range :(\n\n", stderr);
            return EXIT_FAILURE;
        }
    }

    for (int i = 0; i < argc - 1; ++i)
        printf("%ld\n", data[i]);

    free(data);
}

答案 2 :(得分:0)

为什么与if( argc > 11 || argc < 2 ) {中的11进行比较?

length = argc-1;
p_heap = malloc(sizeof(length));

sizeof(length)sizeof(int),如果您希望的话,它不取决于length的值

  

strcpy(p_heap,长度);

strcpy 得到两个char* length 值是args的数目,而不是char数组的地址,因此结果是不确定的,可能很引人注目

convert(p_heap, length);

convert 的第一个参数必须是char**,但是p_heapchar*

void convert(char** source, int length){
  int *dst;
  int i;

  for(i=0;i<length;i++) {
    dst = atoi([i]); 
  } 
     

}

您不使用 source

dst int*,而 atoi 返回 int

[i] ???

在提供S.O上的代码之前我建议您先使用较高的警告级别(例如,{em> gcc 的gcc -pedantic -Wextra)检查它的编译情况,而不会产生警告/错误。