我不明白函数getline
在这里是如何工作的。为什么换行字符被排除在for循环之外?为什么要在单独的块中测试换行符的存在?
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line */
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* getline: read a line into s, return length */
int getline(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;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
答案 0 :(得分:1)
getline
会从stdin
读取一行。由于换行符由换行符('\n'
字符)分隔,getline
将读取并包含换行符。 getline
读取换行符是没有意义的,因为它会读取多行。
有三种情况可能导致for循环停止。
1)遇到\'n'
。
如果发生这种情况,它会在添加空终结符之前将新行添加到当前字符串的末尾。这就是if (c == '\n')
的用途。
2) EOF读取或 3)读取的最大字符数。
如果出现上述任何一种情况,则会跳过在字符串末尾添加换行符,并且只添加空终止符。
null终止符('\0'
字符)是C表示字符串结尾的方式。
答案 1 :(得分:1)
它们在循环中排除\ n然后随后检查\ n的原因是因为在完成for循环之后仍然分配了c的值(仍在范围内)。一个看起来有点复杂的原因是他们决定排除括号。由于函数是获取下一行,当你得到换行符“\ n”时,一行将“结束”。要写这个,所以它看起来更具可读性:
int getline(char s[],int lim)
{
int c,
int 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)
在阅读直到行尾时,有三个重要案例需要考虑。那些是:
EOF
,因此没有其他内容可供阅读。在for
循环中,以下内容:
i < ( lim - 1 )
检查案例1。( c = getchar() ) != EOF
检查案例2(丑陋)。c != '\n'
检查案例3。...因为读取换行符需要短路的原因是因为这是函数的内涵。它还会读取换行符并将其包含在字符串中。最后一步:
s[ i ] = '\0';
...确保它是NULL
终止的字符串(C中的约定)。然后它返回读取的字节数(这并不罕见)。
答案 3 :(得分:0)
我也提出了这个问题。以下是您问题的可能答案。
1)这个问题的第一个误解是getline本身。 特别是在此代码中,getline是用户定义的函数。 某些编译器可能会弹出错误。因此,请尝试使用此功能的其他名称(也许是getl或您认为适合自己的东西)
2)其次,main()充当接受输入字符串的中间件。 它检查输入字符串的长度(由函数getline()计算)是否大于零和最大值
3)复制功能复制字符数组中最长字符串的值。
打印代码时说:printf(“%s”,最长); 现在出现了一个问题。为什么不用for循环来打印字符串。 那也是正确的,但它需要更多的步骤和迭代,这是低效的。
这就是我想出来的。