• ベストアンサー

文字列について

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 このように、文字化けしています。 何が原因なのでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • t-sazen
  • ベストアンサー率42% (37/87)
回答No.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さんのご意見に賛成)

yata16
質問者

お礼

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

その他の回答 (3)

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.3

0の時に特別な処理をしているから1から与えれば いいと思います。 まあ、name[4] = '\0'; をどこかに入れてたらい いんじゃないですか?せっかく余分に1バイト持っ ているのだから。 しかし、引数を書換える恐るべき副作用を持った 関数ですね。まあ、値渡しだからこと無きになっ ていますが、このようなコードは精神衛生によく 無いですね。

yata16
質問者

お礼

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

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

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

yata16
質問者

お礼

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

回答No.1

/* 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; }

yata16
質問者

お礼

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

関連するQ&A