无法计算输出中的行数

时间:2016-07-05 20:37:17

标签: c getchar

以下是代码:

#include <stdio.h>

int main(void) {
    int nextChar;
    int numLines = 0;

    while  ((nextChar = getchar())!= EOF) {
        if (nextChar == '\n') {
           ++numLines;
        }
    }
    printf("The\nsky\nis\nblue\n");
    printf("%d lines read.\n", numLines);
    return 0;
}

它运行,但返回0行读取。我试过把“天空是蓝色的”&#39;文本在一堆不同的地方,但似乎没有任何作用。

代码显示在书中,但没有

    printf("The\nsky\is\blue.\n");

但输出显示为:

    The
    sky
    is
    blue.
    4 lines read.

任何建议??

2 个答案:

答案 0 :(得分:2)

您的程序正在寻找EOF来自while循环。要输入EOF,请使用:

^Z (Ctrl + Z) in Windows
^D on Unix-like systems

CTRL + D适用于Ubuntu。我在我的机器上运行了你的代码。要获得所需的输出,您需要输入 -

The  (Press Enter) 
Sky  (Press Enter)
is   (Press Enter) 
Blue (Press Enter) 
(and finally send EOF)

ENTER会将'\ n'字符发送到Ubuntu上的程序。 Windows使用\ r \ n表示按下了回车键,而Linux和Unix使用\ n表示按下了回车键。

答案 1 :(得分:0)

好吧,我想我知道你要做什么了。首先,您必须确定如何获得输入。我现在假设您想从命令行获取它。当你使用getChar()时,它计算1个字符加上新行,所以你实际上只计算你输入的字符数。当你从控制台得到一行时,它计数\作为一个字符,n作为另一个字符。您可以做的是手动检测字符串中的转义字符,因为您似乎有兴趣检测序列&#34; \ n&#34;。每当你点击Enter并从控制台返回该行,你实际上会得到&#39; \ n&#39;最后的字符与&#34; \ n&#34;不同,如果您愿意,可以单独计算。这是一个例子来说明:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char* currentChar;
    char* nextChar;
    int numLines = 0;
    int bufferSize = 100;
    char *input;
    int inputLength;

    input = (char *) malloc(bufferSize);
    inputLength = getline(&input, &bufferSize, stdin);

    for (int i = 0; i < inputLength; i++) {
        currentChar = input[i];
        if (currentChar == '\\' && i < inputLength - 1) {
            nextChar = input[i + 1];
            if (nextChar == 'n')
                numLines++;
        }
    }

    printf("%d lines read.\n", numLines);
    return 0;
}