美文网首页
C 笔记十 字符数组

C 笔记十 字符数组

作者: 吃柠檬的鸮 | 来源:发表于2019-03-25 16:54 被阅读0次

编写程序,读入一组文本行,并把最长的文本行打印出来。

程序算法的基本框架如下:

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
$ 

相关文章

  • C 笔记十 字符数组

    编写程序,读入一组文本行,并把最长的文本行打印出来。 程序算法的基本框架如下: while (还有未处理的行)  ...

  • C语言笔记——这都是些比较杂的东西了

    C语言笔记——这都是些比较杂的东西了 字符数组 字符数组可以有以下几种初始化方式,选择自己喜欢的(也就是简便的来记...

  • 再学C语言之指针要点

    C之字符数组 C之指针引用字符串 C语言之数组指针 数组指针:首先它是一个指针,它指向数组指针数组:首先它是一个数...

  • C++ 学习笔记之——字符串和字符串流

    1. 字符数组 字符数组,也就是存放字符类型数据的数组,只不过字符数组的结尾必须是 '\0'。C++ 已经提供了一...

  • C语言- 字符、字符数组

    字符数组和字符串 C语言中没有字符串这种数据类型,C语言中通过char型数组来替代字符串的功能。C语言中的字符串一...

  • 流程控制与数组(数组)

    数组 定义数组 数组的显示初始化 输出字符串和字符串函数 ANSI C提供了如下常用的标准函数来处理C字符串

  • C-字符串

    字符串 在 C 语言中,字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。C 编译器会在初始化数组...

  • 字符数组与字符串

    1字符数组:定义 char a[]={'a','b','c','d'}; 字符数组的字符必须带单引号,双引号报错 ...

  • C 和 Java 中字符串和字符数组的对比

    1. C 和 Java 中字符串和字符数组的对比 实现原理 在 C 语言中,字符串和字符数组本质上都是一块连续的内...

  • NDK启航篇——C语言基础(字符串)

    我们写程序肯定会用到字符串,那么C中的字符串怎么写呢? C中的字符串写法 字符串数组存储字符串字符串数组最后要写结...

网友评论

      本文标题:C 笔记十 字符数组

      本文链接:https://www.haomeiwen.com/subject/uuavvqtx.html