编写程序,读入一组文本行,并把最长的文本行打印出来。
程序算法的基本框架如下:
while (还有未处理的行)
if (该行比已处理的最长行还要长)
保存该行
保存该行的长度
打印最长行
程序要求打印最长行,所以文本的读取应该是以行为单位而不是单词。因此首先应该有一个读取行的函数,这里定义了一个名为 mygetline 函数(本来是定义了 getline,但是编译报错 “previous declaration of ‘getline’ was here : extern _IO_ssize_t getline (char **__restrict __lineptr,”)。
int mygetline(char line[], int limit) {
int len = 0;
int c;
if ((c = getchar()) == EOF) {
return 0;
}
while (c != '\n') {
line[len] = c;
++len;
if (len == (limit - 1))
break;
c = getchar();
}
line[len] = '\0';
return (len + 1);
}
mygetline 的第一个参数 line 声明为数组, 第二个参数 limit 声明为整型,用来限制读取的行的长度。函数返回该行的实际长度。
由于每行至少会有一个换行符,故长度至少为 1,所以 0 不是有效的行长度,故取 0 作为标志文件结束的返回值。
当读取到换行符的时候,表示一行读取完毕,此时 \n
并没有保存在字符数组中,而是把空字符 ’\0
' 插入到数组的结尾,标记该行结束,因此实际所能读取的字符的最大长度是 limit - 1,当输入的字符大于该值,当前行的剩余字符将被舍弃。
while (/* condition */) {
...
if (len == (limit - 1))
break;
...
}
程序需要保存当前读取到的最长行,这里定义了一个字符数组 longest 来保存最长行,同时定义一个函数用于将读取到的最长行保存到 longest 中。
void setLine(char line[], char longest[]) {
int i = 0;
while ((longest[i] = line[i]) != '\0') {
++i;
}
}
最后定义一个函数用于打印结果:
void display(char line[]) {
int i = 0;
putchar('\n');
while (line[i] != '\0') {
putchar(line[i]);
++i;
}
putchar('\n');
}
完整的程序如下:
/* chararr.c */
#include <stdio.h>
#define MAX 1000 /* 允许的最大行长度 */
int mygetline(char line[], int limit) {
int len = 0;
int c;
if ((c = getchar()) == EOF) {
return 0;
}
while (c != '\n') {
line[len] = c;
++len;
if (len == (limit - 1))
break;
c = getchar();
}
line[len] = '\0';
return (len + 1);
}
void setLine(char line[], char longest[]) {
int i = 0;
while ((longest[i] = line[i]) != '\0') {
++i;
}
}
void display(char line[]) {
int i = 0;
putchar('\n');
while (line[i] != '\0') {
putchar(line[i]);
++i;
}
putchar('\n');
}
int main() {
int max = 0;
int len = 0;
char longest[MAX], line[MAX];
while ((len = mygetline(line, MAX)) > 0) {
if (len > max) {
max = len;
setLine(line, longest);
}
}
if (max > 0)
display(longest);
return 0;
}
编译运行结果:
$ ./chararr.out
april is a dog's dream
the soft grass is growing
the sweet breeze is blowing
the air all full of singing feels just right
so no excuses now
we're going to the park
to chase and charge and chew
and I will make you see
what spring is all about
the air all full of singing feels just right
$
网友评论