2016-10-12 2 views
-1

Я пишу программу, которая использует sprintf для преобразования целых чисел в строки. Чтобы дать вам больше контекста, моя программа имеет родительский процесс, который порождает столько детей, сколько необходимо для вычисления сумм приведенных аргументов командной строки. Каждый дочерний процесс получает 2 аргумента для вычисления. Вся эта часть была легкой, это просто процесс возвращения, который меня путает. Я возвращаю суммы, и теперь мне нужно превратить их в строки. Так я думал, что-то, как это будет работать,sprintf продолжает возвращать ту же строку

for(int i=1; i<10; i++) { 
     if (array[i] == 0) { 
      break; 
     } 
     temp = array[i]; 
     sprintf(sums, "%d", temp); 
     argv[i]=*sums; 
} 

for (int i=0; i<10; i++) { 
     printf("argv[%d]: %s\n", i, argv[i]); 
} 

Однако, вместо того, чтобы вывод, который выглядит следующим образом:

argv[0] = ./master 
argv[1] = 3 
argv[2] = 7 
argv[3] = 11 
argv[4] = 15 
etc... 

я получаю это:

argv[0] = ./master 
argv[1] = 15 
argv[2] = 15 
argv[3] = 15 
argv[4] = 15 
etc... 

Я не могу понять почему последняя сумма повторяется. У меня такое чувство, что это связано с тем, как я использую sprintf, но я потратил почти целый день, пытаясь понять это, и я законно застрял. Кстати, я объявил массив в верхней части моей программы, как

int array[10]={0};

+2

'ARGV [я] = * суммы,' не как копировать строки. Это также очень плохая идея переписать 'argv'. –

+0

Чтобы выделить память и скопировать строку: [strdup] (https://linux.die.net/man/3/strdup) – kaylum

+0

Извините, я новичок в программировании. Должен ли я выделять память вне цикла for? –

ответ

0

Объединяя свой код, и комментарии людей, я считаю, что это то, что в настоящее время предлагается:

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

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

    char number_string[128]; 
    char *my_argv[100]; 
    int my_argc = 0; 
    int array[] = { 3, 7, 11, 15, 0 }; 

    my_argv[my_argc++] = strdup(argv[0]); 

    for (int i = 0; array[i] != 0; i++) { 
     sprintf(number_string, "%d", array[i]); 
     my_argv[my_argc++] = strdup(number_string); 
    } 

    for (int i = 0; i < my_argc; i++) { 
     printf("argv[%d]: %s\n", i, my_argv[i]); 
     free(my_argv[i]); 
    } 

    return 0; 
} 

Если у вас нет strdup() по какой-либо причине, вы можете сделать эквивалент, используя malloc() и strcpy(). Повторное использование argv[] не имеет смысла, поскольку его размер ограничен argc, который вы даже не рассматриваете.

ВЫВОД

> ./master 
argv[0]: ./master 
argv[1]: 3 
argv[2]: 7 
argv[3]: 11 
argv[4]: 15 
> 
+0

Вы можете использовать 'argv' как имя переменной, но вы должны изменить' argv' в 'main' на что-то другое, например:' int main (int ac, char ** av) ', если вы хотите использовать это имя в 'main'. – deamentiaemundi

+0

@deamentiaemundi, меня не волновало, что он повторно использовал имя 'argv', я был обеспокоен тем, что он повторно использовал массив' argv [] ', независимо от его имени. Хотя я не вижу причины повторно использовать имя как то, что он собирается делать с массивом, который ожидает, что он будет называться чем-то конкретным? – cdlane

Смежные вопросы