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

标签 c

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

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

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

 ?asdfadsbgasdfassadfasdfsadfads
 asdf
 asdf
 asd
 v
 asdf
 asdf
 asd
 f
 asdf

这是标准输出的输出:

   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);
}

最佳答案

你的问题是你没有设置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;
}

关于c - 如何打印字符串数组的某些部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6620600/

相关文章:

C 程序结束时的错误处理

c - 理解递归宏扩展

c - 未定义的行为似乎与 C 中的运算符优先级规则相矛盾

c - 如何进行不区分大小写的字符串比较?

c - 如何在C编程中使用双向链表接受字符串?

c - 工作队列的这些标志是什么意思?

C2100 错误 : Illegal Indirection

c - 遍历C中的已知结构

c - C 程序的参数是否保证以 '\0' 终止?

c - 关于光线追踪算法相交测试性能的问题