我是新手。我一直在研究 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
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111E11111111111111111111111111111ME ??i?F???4?w??>&Y?_???xf?7U?h@? ??i??7U?v??i??7U??7U?(?7U?@? H??i?8?7U??7U?
它打印了这一行,但它给出了所有这些异常的输出。我试图找出原因,但我似乎无法找到原因。
但是,我很确定问题出在 getaline 函数上。
任何帮助将不胜感激! :)
最佳答案
您将 c
与当前字符混淆了。
试试这个,改变这个
for (i =0; i < MAXLINE; ++i)
与
for (i = 0 ; i < c ; ++i)
支票应该是
if (line[i] != '\0')
代替
if (c != '\0')
您的 getaline()
函数返回,i
读取的最后一个字符的位置,您正在将它与空终止字节进行比较。
此外,如果您以 null 终止字符串,为什么不直接
printf("%s\n", line);
这段代码应该可以工作
#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)
printf("%s\n", line);
return 0; // you must return from main()
}
/* 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;
}
关于无法弄清楚为什么我得到奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27707601/