C语言 K&R练习1-21

hvvq6cgz  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(130)

练习1-21。写一个程序entab,用最小数量的制表符和空格来替换空格字符串,以达到相同的间距。使用与detab相同的制表位。当一个制表符或一个空白就足以到达制表位时,应该优先考虑哪一个?
我为练习写的代码:

#include <stdio.h>

#define TAB 8

void entab(int space);

int main()
{
    int c, i;

    i = 0;

    while ((c = getchar()) != EOF)
    {
        if (c == ' ')
            ++i;

        else if (c == '\t')
            i = i + TAB;

        else
        {
            entab(i);
            i = 0;
            putchar(c);
        }
    }

    return 0;
}

void entab(int space)
{
    int i;

    for (i = 1; space >= TAB; ++i)
        if (i == TAB)
        {
            putchar('\t');
            i = 0;
            space = space - TAB;
        }

    for (i = 0; i < space; ++i)
        putchar(' ');
}

字符串
但是当我给予它输入“3个空格+一个制表符+ 5个空格+ j”时,我得到的输出比输入长:
x1c 0d1x的数据
图片中的第一行是输入,第二行是输出
更新:
根据其中一个注解和其中一个答案重写代码如下:

#include <stdio.h>

#define TAB 8

void entab(int space);

int main()
{
    int c, i, l;

    i = l = 0;

    while ((c = getchar()) != EOF)
    {
        ++l;

        if (c == ' ')
            ++i;

        else if (c == '\t')
            i = i + TAB - (l%8);

        else
        {
            entab(i);
            i = 0;
            putchar(c);
        }

        if (c == '\n')
            l = 0;
    }

    return 0;
}

void entab(int space)
{
    int i;

    for (i = 0; space >= TAB; ++i)
        if (i == TAB)
        {
            putchar('\t');
            i = -1;
            space = space - TAB;
        }

    for (i = 0; i < space; ++i)
        putchar(' ');
}


但现在的问题是它总是比输入少一个字符:

bvhaajcl

bvhaajcl1#

您看到的输出比输入长,因为程序将每个空格替换为一个制表符和一些空格。您应该修改entab函数,将空格字符串替换为一个制表符,后跟适当数量的空格。

#include <stdio.h>

#define TAB 8

void entab(int space);

int main()
{
    int c, i, l;

    i = l = 0;

    while ((c = getchar()) != EOF)
    {
        ++l;

        if (c == ' ')
            ++i;
        else
        {
            entab(i);
            i = 0;
            putchar(c);
        }

        if (c == '\n')
            l = 0;
    }

    return 0;
}

void entab(int space)
{
    int i, num_tabs, num_spaces;

    if (space == 0)
        return;

    num_tabs = space / TAB;
    num_spaces = space % TAB;

    for (i = 0; i < num_tabs; ++i)
        putchar('\t');

    for (i = 0; i < num_spaces; ++i)
        putchar(' ');
}

字符串

相关问题