尝试实现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?
(?最后)。
为什么最后会出现问号?
答案 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';