電子書籍の厳選無料作品が豊富!

textファイルをいくつかに分割して保存しようと思い、以下のプログラムを作りましたが、うまくいきません。
予定では "0000.txt", "0001.txt", ....と文字列を生成するはずです。

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

#define LENGTH 4//番号の桁数


void filename(int n)
{
   char name[LENGTH +4 +1];
   char text[5] = ".txt";
   int i;

   for(i = 0; i <= LENGTH; i++)
      name[i] = '0';


   i = LENGTH;
   //自然数を文字列に変換
   do{
      name[i] = (char)(n%10 + 48);
      i--;
      n /= 10;
   }while(n != 0 && i >= 0);

   strcat(name, text);

   printf("filename:%s", name);
}

int main(void)
{
   int i;

   for(i = 0; i < 5; i++){
      filename(i);
      printf("\n");
   }

   return 0;
}

実行結果は
filename:00000@.txt
filename:00001.txt
filename:00002.txt
filename:00003.txt
filename:00004.txt
このように、文字化けしています。
何が原因なのでしょうか。

よろしくお願いします。

A 回答 (4件)

#include <conio.h>


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

#define LENGTH 4 //番号の桁数


void filename(int n)
{
  char name[LENGTH+4+1];

  sprintf(name,"%05d\.txt",n);
  printf("filename:%s", name);
}

int main(void)
{
  int i,j;

  for(i = 0; i < 5; i++)
  {
    j = i;
    filename(j);
    printf("\n");
  }
  return 0;
}

これでスッキリするはずです。
ループ変数iをそのまま引数に使うことは是非避けたいところです。(#3さんのご意見に賛成)
    • good
    • 0
この回答へのお礼

sprintfは便利ですね。知りませんでした。
ありがとうござました。

お礼日時:2008/08/25 10:24

0の時に特別な処理をしているから1から与えれば


いいと思います。
まあ、name[4] = '\0'; をどこかに入れてたらい
いんじゃないですか?せっかく余分に1バイト持っ
ているのだから。

しかし、引数を書換える恐るべき副作用を持った
関数ですね。まあ、値渡しだからこと無きになっ
ていますが、このようなコードは精神衛生によく
無いですね。
    • good
    • 0
この回答へのお礼

>しかし、引数を書換える恐るべき副作用を持った
仰るとおりです・・・。
配慮に欠けていました。
ありがとございました。

お礼日時:2008/08/25 10:23

素直に snprintf() とかを使いましょう。

    • good
    • 0
この回答へのお礼

そんな関数あるですね。
ありがとうございました。

お礼日時:2008/08/25 10:22

/*


C#やJavaの文字列ではNULLで閉じるって概念があまりないので自信ないけど,ヒントにはなるんじゃないかと。
*/

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

#define LENGTH 4 //番号の桁数


void filename(int n)
{
char name[LENGTH +4 +1];
char text[5] = ".txt";
int i;

for(i = 0; i < LENGTH; i++){ // 0から4までじゃなくて0から3までの4つ
name[i] = '0';
}

name[LENGTH] = '\0'; // NULLで閉じてみた(俺の環境だとwが余計に付いたため)


i = LENGTH - 1; //同様に 3から0まで4つ。
//自然数を文字列に変換
do{
name[i] = (char)( n%10 + 48);
i--;
n /= 10;
}while(n != 0 && i >= 0);

strcat(name, text);

printf("filename:%s", name);
}

int main(void)
{
int i;

for(i = 0; i < 5; i++){
filename(i);
printf("\n");
}

return 0;
}
    • good
    • 0
この回答へのお礼

NULLで閉じてみたところうまくいきました。
ありがとうございました。

お礼日時:2008/08/25 10:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!