- ベストアンサー
文字列について
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 このように、文字化けしています。 何が原因なのでしょうか。 よろしくお願いします。
- みんなの回答 (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さんのご意見に賛成)
その他の回答 (3)
- Tasuke22
- ベストアンサー率33% (1799/5383)
0の時に特別な処理をしているから1から与えれば いいと思います。 まあ、name[4] = '\0'; をどこかに入れてたらい いんじゃないですか?せっかく余分に1バイト持っ ているのだから。 しかし、引数を書換える恐るべき副作用を持った 関数ですね。まあ、値渡しだからこと無きになっ ていますが、このようなコードは精神衛生によく 無いですね。
お礼
>しかし、引数を書換える恐るべき副作用を持った 仰るとおりです・・・。 配慮に欠けていました。 ありがとございました。
- koko_u_
- ベストアンサー率18% (459/2509)
素直に snprintf() とかを使いましょう。
お礼
そんな関数あるですね。 ありがとうございました。
- himajin100000
- ベストアンサー率54% (1660/3060)
/* 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; }
お礼
NULLで閉じてみたところうまくいきました。 ありがとうございました。
お礼
sprintfは便利ですね。知りませんでした。 ありがとうござました。