c - 输出末尾有问号

标签 c

尝试实现 K&R 书籍 http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_1:Exercise_20 中描述的 detab 功能遇到一个问题:输出替换的字符串时,输出末尾有一个问号。为什么?

#include <stdio.h>
#define MAXLINE 9999

void get_text(char output[]);
void detab(char input[], char output[], int tab_size);

int main()
{
    char input[MAXLINE];
    char final[MAXLINE];
    get_text(input);
    detab(input, final, 4);
    for (int i = 0; final[i] != '\0'; ++i)
    {
        putchar(final[i]);
    }
    putchar('\n');
    return 0;
}

void get_text(char output[])
{
    int c;
    int i = 0;
    for (i = 0; i < MAXLINE && (c = getchar()) != EOF; ++i)
    {
        output[i] = c;
    }
    output[i + 1] = '\0';
}

void detab(char input[], char output[], int tab_size)
{
    int c = 0;
    int r = 0;
    for (int i = 0; input[i] != '\0'; ++i)
    {
        c = input[i];
        if(c == '\t')
        {
            for (int t = 0; t < tab_size; ++t)
            {
                output[r] = '.';
                r++;
            }
        }
        else
        {
            output[r] = c;
            r++;
        }
    }
    output[r] = '\0';
}

这是我传递包含以下内容“asdasdads tasdasdasdasdasd Sadasdasd”的文件时的输出:
asdasdads....tasdasdasdasdasd....sadasdasd?(?在最后)。 为什么最后有一个问号?

最佳答案

output[i + 1] = '\0';

您不需要添加1在这里,它已经在循环中完成了。 (首先 i 递增,然后 i < MAXLINE && (c = getchar()) != EOF 被测试,因此 i 已经比上一次循环迭代高)

关于c - 输出末尾有问号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21069146/

相关文章:

c - 坂本智彦的算法是如何工作的?需要详细解释

c - 以字符指针作为参数的函数

c - 指针递增运算符错误

c++ - 分配给 double 的数字上的 F 后缀

c - 为什么建议在打印前将指针转换为通用指针?

c - stdlib 中 random() 的分布是什么?

c - 如何从/dev/xxxx读取数据?

cs50 pset1 贪婪。我不必使用%?

c - c中的函数描述符

char*[] 元素每个占用 4 个字节,而 char[] 每个元素占用 1 个字节?