我正在从 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 测试了这段代码,它工作正常。
这个程序的逻辑如下:
- 将当前字符保存为上一个字符。
- 获取下一个字符并使其成为当前字符。
- 检查当前字符是否为换行符。
- 如果是,那么我们增加行计数器并重新开始循环。
- 检查当前字符是否为 EOF,检查前一个字符是否为换行符。
- 如果是,则跳出循环。
- 检查当前字符是否为 EOF。
- 如果是,则增加行计数器并跳出循环。
这就是你如何处理没有被换行符终止的最后一行,并且仍然将它算作一行。请注意,这被认为是一种特殊情况,需要明确编码。如果您继续从事软件开发行业,那么您会遇到很多特殊情况,您需要为遇到的每一种情况编写处理代码。
希望这对您有所帮助。