1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5681

sprintf文内に配列を使った後、配列の値を保持するにはどうすればよいですか?
投稿者---ピヨピヨ@大変お世話になっています(2006/05/03 17:27:49)


下記(※)の値が配列初期化時と変わる理由がわかりません。

あらかじめ名前がわかっている複数のファイルをAという配列に入れます。
ただし、ファイル数は不定です。いちいちファイル数を数えて配列Aの[]に値を入れません。
全てのファイル名の先頭にResult_という文字を追記して新たに配列Bに格納しようとしています。
ファイル数は下記(★)でカウントして
A[0]にはsample_a.txt
A[1]にはsample_b.txt
A[2]にはsample_c.txt

B[0]にはResult_sample_a.txt
B[1]にはResult_sample_b.txt
B[2]にはResult_sample_c.txt
が入る結果を期待します。(後で配列名を使ったfopenを利用するためです。)

実行した結果、
whileループ内ではうまく値が入っているように見えますが、
(※)ではBの値の一部?が入っています。
Aの配列の値(ファイル名)を変えない術をご指導いただきたく存じ上げます。
環境はWindows2000,VC++6.0です。
よろしくお願いします。

char A[][35]={"sample_a.txt",
              "sample_b.txt",
               "sample_c.txt"}; //いくつでも付け足せるとします。

char B[][35]={ NULL };

char str1[8];
int count = 0;

strcpy(str1, "Result_");

while(count< (sizeof(A) / sizeof(A[0]) ))//(★)
{   
    printf("pre_A[%d]:%s\n",count,A[count]);//sprintf前

    sprintf(B[count],"%s%s",str1,A[count]);

    printf("Count: %d\n",count);
    printf("str1: %s\n",str1);
        printf("A[%d]:%s\n",count,A[count]);
    printf("B[%d]:%s\n\n",count,B[count]);
count++;
}
    printf(" %s\n", A[0]);//(※)
    printf(" %s\n", A[1]);//(※)
    printf(" %s\n", A[2]);//(※)



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:sprintf文内に配列を使った後、配列の値を保持するにはどうすればよいですか? 5682 あかま 2006/05/03 18:21:19
<子記事> Re:sprintf文内に配列を使った後、配列の値を保持するにはどうすればよいですか? 5683 shu 2006/05/03 18:29:52


No.5682

Re:sprintf文内に配列を使った後、配列の値を保持するにはどうすればよいですか?
投稿者---あかま(2006/05/03 18:21:19)


char B[][35]={ NULL };

だとBが必要な分だけ確保されないからでしょう

char B[sizeof(A) / sizeof(A[0])][35]={ NULL };

とすればよいかと思います。



この投稿にコメントする

削除パスワード

No.5684

Re:sprintf文内に配列を使った後、配列の値を保持するにはどうすればよいですか?
投稿者---ピヨピヨ@大変お世話になっています(2006/05/03 18:36:37)


あかま殿
 
早速のご返答ありがとうございます。
仰っていただいた通り修正しましたら、実行がうまくいきました。
これで、余分に配列Cを用意するとか、Aをさらに書き直すといった
個人的にはめんどうと思っていたことをせずにすみます。

ただ、、、
恐れ入りますが、1点わからないことがございます。
>Bが必要な分だけ確保されないからでしょう
配列Aに入っている値(今回の例ではファイル名)になぜ影響されますか?
 
私には、配列Aに入っている値をプログラムで上書きしている、
あるいはBに影響されている(データの流れと申しましょうか、)のが
どこかわかりません。
Aの値は初期化で固定されていると思っているのですが、間違いでしょうか。
恐縮ですが、よろしくお願いします。 
 


この投稿にコメントする

削除パスワード

No.5683

Re:sprintf文内に配列を使った後、配列の値を保持するにはどうすればよいですか?
投稿者---shu(2006/05/03 18:29:52)


ループをforを使って表現する。
データを作るループと、データを表示するループにわける。

と、解かるようになるかも・・・・・・


この投稿にコメントする

削除パスワード

No.5685

Re:sprintf文内に配列を使った後、配列の値を保持するにはどうすればよいですか?
投稿者---ピヨピヨ@大変お世話になっています(2006/05/03 19:10:58)


shu殿

ご助言ありがとうございます。
しかし、残念ながらまだわかりません。
私が意図を読み間違えているかもしれませんが、
方向性は下記であっておりますでしょうか?
実行結果から因果関係を見ると、
A[x]にはB[x+1]の値が中途半端に入っています。なぜだろう。
 
>ループをforを使って表現する。
for(count=0;count< (sizeof(A) / sizeof(A[0]) );count++)

>データを作るループと、データを表示するループにわける。
for(count=0;count< (sizeof(A) / sizeof(A[0]) );count++)
{
    sprintf(B[count],"%s%s",str1,A[count]);
}

for(count=0;count< (sizeof(A) / sizeof(A[0]) );count++)
{
    printf("Count%d %s\n",count, A[count]);
    printf("Count%d %s\n",count, B[count]);
}



この投稿にコメントする

削除パスワード

No.5686

Re:sprintf文内に配列を使った後、配列の値を保持するにはどうすればよいですか?
投稿者---si(2006/05/03 21:48:45)


>A[x]にはB[x+1]の値が中途半端に入っています。なぜだろう。
最初に掲示されたプログラムの最終表示結果が
Result_sample_b.txt
Result_sample_c.txt
sample_c.txt
となることが分からないのですか?
これは、単に、A[]とB[]が隣接して配置され、かつ
B[]A[]の順になっていたためにそうなっただけです。
B[][35] = {NULL}; <ー 1ヶしか確保されていない。
B[1] イコール A[0] となっていた。


この投稿にコメントする

削除パスワード

No.5687

Re:sprintf文内に配列を使った後、配列の値を保持するにはどうすればよいですか?
投稿者---ピヨピヨ@大変お世話になっています(2006/05/03 22:22:46)


si殿
 
ご指導ありがとうございます。
どこで代入しているのかばっかり見ていて、理由が全く分かりませんでした。
  
なるほど、配列がとなりにあったのですね。
配列のアドレスを見れば裏付けれると思うので試してみます。
 
皆さま、ご協力感謝します。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ