Преобразуйте массив аргументов командной строки и сохраните их в массиве int - PullRequest
0 голосов
/ 26 февраля 2019

Я пишу программу, которая принимает массив аргументов из командной строки (например, 10 20 30 40), преобразует их в целые числа и сохраняет их в массиве int, который будет использоваться позже.Я объявил указатель на кучу.Я хочу сохранить количество номеров из CL в переменной длины.Затем выделите место для длины и скопируйте его в кучу.Затем используйте функцию, которая преобразует аргументы командной строки в целое число и копирует их в массив 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 голосов
/ 26 февраля 2019
#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);
}
0 голосов
/ 26 февраля 2019

почему сравнение с 11 в if( argc > 11 || argc < 2 ) {?

в

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

sizeof(length) равно sizeof(int) и не зависит от значенияlength если бы это была ваша надежда

В

strcpy (p_heap, length);

strcpy получить два char*, length определяет количество аргументов, а не адрес массива char, поэтому результат не определен и, вероятно, впечатляющий

In

convert(p_heap, length);

первый аргумент convert должен быть char**, но p_heap является char*

в

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

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

}

вы не используете источник

dst равен int*, в то время как atoi возвращает int

[i] ???

Прежде чем давать код на SO, я рекомендую сначала проверить его компиляцию без предупреждения / ошибки, используя высокий уровень предупреждения (например, gcc -pedantic -Wextra для gcc )

0 голосов
/ 26 февраля 2019

Примечание: я предполагаю правильный ввод от CL.

Я хочу сохранить число чисел от CL в переменной длины.

Если вы считаете правильнымввод из CL, тогда у вас есть это число в argc-1.

Затем выделите место для длины и скопируйте его в кучу.

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

Затем используйте функцию, которая преобразует аргументы командной строки в целое число и копирует их в массив int.

for(int i=0; i<argc-1; i++) 
    sscanf(source[i], "%d", &dst[i]);

Вам также следует изменить тип возвращаемого значения convert на int *а затем вернуть dst.

...