C - 在while循环的开头和结尾添加字符串

时间:2016-09-13 10:47:52

标签: c string printf concatenation modulo

我试图构建一个字符串 - 在循环中每80个字符,在行的开头添加7个制表符,在结尾添加一个新行。

它应打印出7个标签,然后是80个字符,然后是1个新行,依此类推。

然而,发生了一些奇怪的事情。它在前两个字符之后直接打印一个新行,然后从那时起所有内容都会出现偏斜。

我也不确定为什么我需要%40而不是%80 - 是因为有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);
}

1 个答案:

答案 0 :(得分:2)

  

然而,发生了一些奇怪的事情。它在前两个字符之后直接打印一个新行,然后从那时起所有内容都会出现偏斜。

由于loop的初始值,请尝试使用int loop = 1;

  

我也不确定为什么我需要%40而不是%80 - 是因为有2个字节?

     

我认为通常我会被2个字节弄糊涂。

关键是,对于您在输入文件中读取的每个字符,您在buffer中写入两个字符,因为您决定将字符打印为两个字节(%02X)。

现在你需要什么:

  • 插入LF并标记输入文件的每80个字符? (这是你期待的吗?)
  • 插入LF并标记输出的每80个字符? (这就是你编码的内容)