c - C中的行计数程序

标签 c

<分区>

我正在从 Brian Kernighan 和 Dennis Ritchie 的一本名为“The C Programming Language”的书中学习 C 语言,并且一直停留在行计数程序的基本类(class)中。该程序运行,但它没有给出输入了多少行的输出。

下面给出了程序代码,请帮忙。

#include <stdio.h>

void main()
{
    int c, nl;
    nl = 0;
    while ((c = getchar()) != EOF )
        if (c == '\n')
            ++nl;
    printf("%d \n", nl);

    return 0;
}

代码应该读取输入,然后输出给定的文本行数。应该如何更改才能使其发挥作用?

最佳答案

您的程序运行良好。但是,我会在 main 前加上 int 类型以保持编译器安静。它应该看起来像这样:

主要内容(无效)

当你调用它时,我所做的是:

$$$ ->./test6 < test4.c
19
$$$ ->wc test4.c
      19      48     379 test4.c
$$$ ->

getchar 函数与 getc(stdin) 相同,因此当您运行程序时,它会接受来自 stdin(键盘)的输入或重定向到 stdin 的文件。

编辑:正如有人指出的那样,如果最后一行没有\n 终止符,则该行将不会被计算在内。所以我重写了你的代码来解决这个问题:

#include <stdio.h>

int main(void)
{
    int c;  /* Character */
    int cp; /* Previous Character */
    int n;  /* Number of lines */

    n = 0;
    c = 0;
    while (1)
    {
        cp = c;
        c = getchar();
        if (c == '\n')
        {
            n++;
            continue;
        }
        if (c == EOF && cp == '\n') break;
        if (c == EOF)
        {
            n++;
            break;
        }
    }
    printf("%d \n", n);

    return 0;
}

如您在代码中所见,我使用 fall-though 逻辑来继续循环或跳出循环。现在我在 FreeBSD 上使用 clang 测试了这段代码,它工作正常。

这个程序的逻辑如下:

  1. 将当前字符保存为上一个字符。
  2. 获取下一个字符并使其成为当前字符。
  3. 检查当前字符是否为换行符。
  4. 如果是,那么我们增加行计数器并重新开始循环。
  5. 检查当前字符是否为 EOF,检查前一个字符是否为换行符。
  6. 如果是,则跳出循环。
  7. 检查当前字符是否为 EOF。
  8. 如果是,则增加行计数器并跳出循环。

这就是你如何处理没有被换行符终止的最后一行,并且仍然将它算作一行。请注意,这被认为是一种特殊情况,需要明确编码。如果您继续从事软件开发行业,那么您会遇到很多特殊情况,您需要为遇到的每一种情况编写处理代码。

希望这对您有所帮助。

关于c - C中的行计数程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30570750/

相关文章:

c++ - 使用 Mutex 共享 1 个字的内存

c api 的编译错误

c - 当我输入 case 触发器时,switch 语句注册为默认值

c - C 中的返回值

c - printf 是否需要 %zu 说明符?

c - C中动态大稀疏矩阵的数据结构

c - mount() after clone() with CLONE_NEWNS set effects parent

c - epoll_wait 接收未知事件

c - 此代码片段如何在 I2C Controller 中工作

c - snprintf() 不适用于就地修改字符串