【发布时间】:2014-12-30 14:54:13
【问题描述】:
我是个新手。我一直在阅读 K&R C 编程书籍,其中一个练习是编写一个程序,打印任何超过 80 行的输入行。这是我的代码:
include <stdio.h>
#define MAXLINE 1000
int getaline(char line[], int maxline);
int main()
{
int i, c;
char line[MAXLINE];
if ((c = getaline(line, MAXLINE)) > 80){
for (i =0; i < MAXLINE; ++i)
if (c != '\0')
printf("%c", line[i]);
printf("\n");
}
}
/* reads a line into S, returns the length of that line */
int getaline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
因此,我会将超过 80 个字符的行通过管道传输到已编译的程序中。这是输出:
猫输入.txt | ./a.out
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ??i?F???4?w??>&Y?_???xf?7U?h@? ??i??7U?v??i??7U??7U?(?7U?@? H??i?8?7U??7U?
它打印该行,但它给出了所有这些异常输出。我试图找出原因,但我似乎找不到原因。
但是,我很确定问题出在 getaline 功能上。
任何帮助将不胜感激! :)
【问题讨论】:
-
遇到
'\0'后继续排行打印字符 -
没有。您只需跳过
'\0'的打印,for 将继续进行 -
i < MAXLINE-->i < c,if (line[i] != '\0') -
否,因为在调用 getaline() 之前没有用 0 填充该行。您从终端读取了一些字符,然后在该行的其余部分有很多垃圾,除非它是 0,否则您很乐意打印它们。
-
@HansKlünder Read
getaline()- 读取后该行始终以 0 结尾。这不是问题。