2016-09-13 16 views
0

ループの80文字ごとに7つのタブを追加し、最後に新しい行を追加しようとしています。C - whileループの先頭と末尾に文字列を追加する

7つのタブ、80文字、1行の改行などが表示されます。

しかし、何か変なことが起こっています。最初の2文字の直後に新しい行が印刷されてから、それ以降はすべてが歪んでいます。

なぜ%80ではなく%40が必要なのかよくわかりません.2バイトがあるからですか?

私は一般的に2バイト混乱していると思います。

void do_file(FILE *in, FILE *out, OPTIONS *options) 
{ 
    char ch; 
    int loop = 0; 
    int sz1,sz2,sz3; 

    int seeker = offsetof(struct myStruct, contents.datas); 

    //find total length of file 
    fseek(in, 0L, SEEK_END); 
    sz1 = ftell(in); 

    //find length from beggining to struct beginning and minus that from total length 
    fseek(in, seeker, SEEK_SET); 
    sz2 = sz1 - ftell(in); 

    int tabs = (sz2/80) * 8;// Total size/size of chunk * 8 - 7 tabs and 1 new line char 
    sz3 = ((sz2 + 1 + tabs) * 2); //Total size + nuls + tabs * 2 for 2 bytes 

    char buffer[sz3]; 

    char *p = buffer; 

    buffer[0] = '\0'; 

    while (loop < sz2) 
    { 
     if(loop % 40 == 0){ 
      //Add 7 tabs to the beginning of each new line 
      p += sprintf(p, "%s", "\t\t\t\t\t\t\t"); 
     } 

     fread(&ch, 1, 1, in); 
     //print hex char 
     p += sprintf(p, "%02X", (ch & 0x00FF)); 

     if(loop % 40 == 0){ 
      //Add a new line every 80 chars 
      p += sprintf(p, "%s", "\n"); 
     } 
     strcat(buffer, p); 
     loop++; 
    } 
    printf("%s", buffer); 
} 
+2

'strcat'のmanページに' The strings are overlapping'と表示されています。 'buffer'が十分に大きいことも確かですか? – mch

+0

_ 7つのタブ、次に80文字、次に1行の改行などが表示されるはずです。 - 80文字(160文字)の16進表現** ** 40文字の16進表現出力のchars? – Sergio

+0

私は40桁の16進数の文字を合計80文字と思います –

答えて

2

しかし、奇妙な何かが起こっています。最初の2文字の直後に新しい行が印刷されてから、それ以降はすべてが歪んでいます。

それは理由loopの初期値を、私は40%ではなく80%を必要とする理由私もよく分からないint loop = 1;

てみてくださいだ - 2つのバイトがあるので、それを何ですか?

私は一般的に2バイト混乱していると思います。

ポイントは、2バイト(%02X)として文字を印刷することを決めたので、あなたが入力ファイルを読み込み、各文字のために、あなたは、bufferで2つの文字を書き、です。

  • 挿入LFとタブ入力ファイルの各80の文字:

    は今、あなたの必要性は何ですか? (それはあなたの期待ですか?)

  • LFを挿入し、出力の各80文字を出力? (これはあなたがコード化したものです)
関連する問題