我很新手。我一直在研究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个字符的行传送给已编译的程序。这是输出:
cat input.txt | ./a.out
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ?? I F ???4瓦特??&gt;有&安培;?ý_ ??? XF 7U H +? ??我?? 7U·V ??我?? ?? 7U 7U?(?7U?@? H 18我?8?7U ?? 7U?
它会打印该行,但它会提供所有这些异常输出。我试图找出原因,但我似乎无法找到原因。
但是,我很确定问题在于getaline功能。
任何帮助将不胜感激! :)
答案 0 :(得分:1)
当它是一个字符时,你正在检查c
,当它是行长计数时;它永远不会等于\0
,所以你一直保持着兴趣。
if ((c = getaline(line, MAXLINE)) > 80){
// c now equals, let's say, 81
for (i =0; i < MAXLINE; ++i)
// c is still 81, we never fail
if (c != '\0')
printf("%c", line[i]);
printf("\n");
}
请考虑一下:
if (getaline(line, MAXLINE) > 80) {
for (i =0; i < MAXLINE; ++i)
{
c = line[i];
if (c != '\0')
printf("%c", c;
else
break;
}
printf("\n");
}
答案 1 :(得分:1)
您将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;
}
答案 2 :(得分:0)
替换
for (i =0; i < MAXLINE; ++i)
if (c != '\0')
printf("%c", line[i]);
通过
for (i =0; i < c; ++i)
printf("%c", line[i]);