C中的行计数程序

时间:2015-06-01 10:09:15

标签: c

我正在从Brian Kernighan撰写的一本名为“The C Programming Language”的书中学习C语言。丹尼斯·里奇(Dennis Ritchie)一直坚守计划线计划的基本教训。程序运行但没有输出输入的行数。

已经给出了以下程序代码,请提供帮助。

foreach ($alllocs as $allrows)

代码应该读取输入,然后输出给出了多少行文本。如何更改以使其有效?

3 个答案:

答案 0 :(得分:4)

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

int main(void)

当你打电话时,我所做的就是:

$$$ ->./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. 如果是,则递增行计数器并跳出循环。
  9. 这就是你如何处理最后一行没有被换行符终止并且仍然把它计为一行。请注意,这被视为特殊情况,需要明确编码。如果你继续从事软件开发专业,那么你会遇到很多特殊情况,你需要为你遇到的每一个代码处理代码。

    希望这有帮助。

答案 1 :(得分:2)

代码没有问题;它工作得很好,只有问题 - 它正在接受输入并且没有提供输出。

在Windows中结束输入, 我们必须按Ctrl + Z,然后按Enter键,它将显示输入中的行数。

答案 2 :(得分:1)

您的代码工作正常。我在Ubuntu中查了一下。

如果您在Linux中工作以结束输入,请按Ctrl + d。