输出结尾的问号

时间:2014-01-11 23:16:58

标签: c

尝试实现K& R book 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?(?最后)。 为什么最后会出现问号?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

我猜这取代了一个不可打印的角色。 final中的字符未特别初始化为任何内容,并且当您说:

时,您将在详细字符串的末尾留下间隙:
output[i + 1] = '\0';

output[i],一个超出输出文本,仍然未初始化。

你想:

output[i] = '\0';