2016-10-12 11 views
-1

私はsprintfを使って整数を文字列に変換するプログラムを書いています。より多くのコンテキストを提供するために、私のプログラムには親プロセスがあり、与えられたコマンドライン引数の合計を計算するのに必要な数の子を生成します。各子プロセスは、2つの引数を受け取り、計算します。その全体の部分は簡単だった、それは私を混乱させている戻りプロセスです。私は総額を取り戻しています。今はそれらを文字列に変換する必要があります。sprintfは同じ文字列を返し続けます

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

私は理解することはできません:

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

私はこれを取得:だから私は、代わりにこのような出力を得るための、しかし、このような何かがうまくいく

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]); 
} 

を考えましたなぜ最後の合計が繰り返されているのか私はsprintfを使用している方法と関係があると感じていますが、これを把握しようと一日を費やしてしまいました。私は合法的に立ち往生しています。ちなみに、私は

int array[10]={0};

+2

'ARGV [I] = *合計;'あなたは、文字列をコピーする方法はありません。また、 'argv'を上書きすることは非常に貧弱です。 –

+0

メモリを割り当てて文字列をコピーするには:[strdup](https://linux.die.net/man/3/strdup) – kaylum

+0

申し訳ありません、私はプログラミングを始めました。 for-loopの外側にメモリを割り当てる必要がありますか? –

答えて

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()を使用して同等の処理を行うことができます。あなたが考慮していないargcにサイズが制限されているので、argv[]を再利用することは意味がありません。

OUTPUT

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

変数名として 'argv'を使うことができますが、' main'の 'argv'をdifferrentに変更する必要があります。たとえば' int main(int ac、char ** av) ' 'main'の名前です。 – deamentiaemundi

+0

@deamentiaemundi、私は彼が 'argv'という名前を再利用しているとは心配していませんでしたが、' argv [] '配列を名前にかかわらず再利用していることに懸念しました。その名前を何か具体的な名前にすることを期待しているアレイで何をしようとしているのかという名前を再利用する理由は見当たりませんが? – cdlane

関連する問題