2017-06-04 7 views
1

にカウンターint型:その後、基本打ち鳴らす:sprintfのリセットは次のことを考えてみましょう0

int fileNo = 0; 
sprintf(outfile, "%03d.jpg", fileNo); 

後で

fileNo++; // fileNo equals 1 now 

その後、あなたは再びこれを呼び出す場合:

sprintf(outfile, "%03d.jpg", fileNo); 

fileNoは今0に等しいです。再び。

ここでの目標は、カウンターをfileNoに保ち、その値をsprintfに渡してファイル名を設定することです。カウンタを文字列値に変換する簡単な方法はありますか?または、私はちょうどfileNoがゼロにリセットされるのを防ぐかもしれない一歩がありませんか?

私はmallocに掘り下げましたが、それが必要なときは本当に明確ではありません。助けて?

(私はプログラミングに新しいものではないんだけど、Cに新しい)

更新

これは非常に単純なプログラムです。再割り当てはありません。デバッガに入ると、sprintf行が実行された直後にfileNoが0にリセットされます。

...

static int fileNo = 0; 
char outfile[7]; 
sprintf(outfile, "%03d.jpg", fileNo); 

...

while(fread(buffer, 1, 512, inptr) == 512) 
{ 
    // 0xff 0xd8 0xff 
    if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff) 
    { 
     if (!found1stJPG) 
     { 
      found1stJPG = true; 

     } else { 
      fileNo++; 
      fclose(outptr); 
      sprintf(outfile, "%03d.jpg", fileNo); // fileNo is 1 before this executes 
      printf("outfile: %s,\n", outfile); // in the debugger fileNo is now 0 
     } 
+2

おそらくあなたのコードをもっと表示する必要がありますが、 'fileNo'が有効範囲外にあると思われ、新しい' fileNo'が '0'の値でインスタンス化されます。 'int fileNo = 0;'を 'static int fileNo = 0;'に変更するとどうなりますか? – mttrb

+3

'sprintf'はカウンタを0にリセットしません。あなたのコードはそうです。私たちは見ることができない部分です。 – Jens

+0

[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。そうしないと、私たちがあなたを助けることはほとんど不可能になります。 –

答えて

2

次き:

char somecharvariable; 
char outfile[7]; 
int fileNo = 0; 
sprintf(outfile, "%03d.jpg", fileNo); 

おっと。文字列ヌルターミネータがfilenoを書きました。 outfileの長さは8でなければなりません。もしfileNoが999を超えると、あなたのコードはとにかくクラッシュします。

スタティックフラグをfileNoに設定しても問題は解決されません。問題を他の変数に再配置するだけです。

+0

* 'outfile'は長さ8でなければなりません。*それでも十分な修正ではありません。 '%03d'形式の文字列は、*少なくとも3バイトが出力文字列に書き込まれます。 –

+0

32ビット整数の10進表記は10桁までの数字を持つことができるので、16が安全な値になりますが、この場合はスタックスペースが厳しく制限されている可能性は低いので、 32と言う。 – Clifford

関連する問題