如何打印字符串数组的某些部分?

时间:2011-07-08 06:17:56

标签: c

我正在编写一个将文件转储为八进制的函数。在达到一行中字符数量的限制后,可以打印出要传入的文件的可打印字符。

由于某种原因,我的程序总是打印文本文件的前16个字符,我将如何打印文件中的其余字符?

这是我用来测试的文本文件:

 ?asdfadsbgasdfassadfasdfsadfads
 asdf
 asdf
 asd
 v
 asdf
 asdf
 asd
 f
 asdf

以下是stdout的输出:

   0000000 77 141 163 144 146 141 144 163 142 147 141 163 144 146 141 163  | ?asdfadsbgasdfas
   0000020 163 141 144 146 141 163 144 146 163 141 144 146 141 144 163 15  | ?asdfadsbgasdfas
   0000040 12 141 163 144 146 15 12 141 163 144 146 15 12 141 163 144  | ?asdfadsbgasdfas
   0000060 15 12 166 15 12 141 163 144 146 15 12 141 163 144 146 15  | ?asdfadsbgasdfas
   0000100 12 141 163 144 15 12 146 15 12 141 163 144 146 15 12 ?asdfadsbgasdfa
   0000120

这是我的代码:

void octaldump(FILE * fp)
{
    int c;
    size_t linecount = 0, index = 0, i;
    long int address = 0;
    char temp [LINESIZE];

    while((c = fgetc(fp)) != EOF)
    {
        if(linecount == 0)
        {
            printf("%07o ", address);
            address += 16;
        }
        temp[index] = c;
        index++;

        printf("%02o ", c);
        linecount++;

        if(linecount == 16)
        {
            printf(" | ");
            for(i = 0; i < linecount; i++)
            {
                if(temp[i] <= 32)
                {
                    printf(".");
                }
                else
                {
                    printf("%c", temp[i]);
                }
            }
            printf("\n");
            linecount = 0;
        }
    }

    if(linecount < 16)
    {
        for(i = 0; i < linecount; i++)
        {
            if(temp[i] <= 32)
            {
                printf(".");
            }
            else
            {
                printf("%c", temp[i]);
            }
        }
    }

    printf("\n%07o ", address);
}

1 个答案:

答案 0 :(得分:3)

您的问题是,在index代码之后,您没有将linecount == 16设置为零。除此之外,这意味着你有一个可怕的缓冲区溢出。

在尾随数据处理中,您应该首先为缺少的字符打印足够的空白,以使可打印字符与其他集对齐。我在评论中使用"%03o"代替"%02o"来提供一致的对齐。此外,使用isprint()中的<ctype.h>可以改善事情。


这对我来说相当不错 - 在自己的源代码上测试:

#include <ctype.h>
#include <stdio.h>

enum { LINESIZE = 16 };

void octaldump(FILE * fp)
{
    int c;
    size_t linecount = 0, index = 0, i;
    unsigned long address = 0;
    char temp [LINESIZE];

    while ((c = fgetc(fp)) != EOF)
    {
        if (linecount == 0)
        {
            printf("%07lo ", address);
            address += 16;
        }
        temp[index] = c;
        index++;

        printf("%03o ", c);
        linecount++;

        if (linecount == 16)
        {
            printf(" | ");
            for (i = 0; i < linecount; i++)
                printf("%c", isprint(temp[i]) ? temp[i] : '.');
            printf("\n");
            linecount = 0;
            index = 0;
        }
    }

    if (linecount < 16)
    {
        for (int j = linecount; j < 16; j++)
            printf("    ");
        printf(" | ");

        for (i = 0; i < linecount; i++)
            printf("%c", isprint(temp[i]) ? temp[i] : '.');
        printf("\n");
    }

    printf("%07lo\n", address);
}

int main(void)
{
    octaldump(stdin);
    return 0;
}