C语言习题(统计输入文本的字符数、行数和单词数)*

编写程序,统计输入文本的字符数、行数和单词数。

思路:

初始化:
    设置字符计数 nc = 0
    设置行计数 nl = 0
    设置单词计数 nw = 0
    设置状态变量 state = OUT (表示当前不在单词内部)

开始:
    循环直到读取完所有字符(直到遇到 EOF):
        读取一个字符 c
        增加字符计数 nc

        如果字符 c 是换行符('\n'):
            增加行计数 nl

        如果字符 c 是空格、换行符或制表符(' ', '\n', '\t'):
            将状态设置为 OUT(表示不在单词内部)

        否则,如果状态是 OUT(表示之前不在单词内,现在开始一个新单词):
            将状态设置为 IN(表示进入单词内部)
            增加单词计数 nw

    输出字符计数 nc
    输出行计数 nl
    输出单词计数 nw
 

注:

  1. 在 Unix/Linux/macOS 系统上

  • EOF 通常是通过按下 Ctrl+D 来输入。
  • 当你按下 Ctrl+D 时,操作系统会将它解释为输入流的结束信号,从而触发 EOF
  1. 在 Windows 系统上

  • EOF 通常是通过按下 Ctrl+Z 来输入。
  • 当你按下 Ctrl+Z 后,操作系统会将其视为输入流的结束标志。

答案:

#include 
#define IN  1
#define OUT 0

int main()
{
    int c;
    int nc = 0, nl = 0, nw = 0;   // 记录字符数,行数,单词数
    int state = OUT;               // 状态变量,用来跟踪是否在单词内部

    // 循环读取字符直到EOF
    while ((c = getchar()) != EOF)
    {
        nc++;  // 每读取一个字符,字符数加1

        if (c == '\n')  // 每遇到一个换行符,行数加1
        {
            nl++;
        }

        // 如果遇到空格、换行符或制表符,说明当前处于单词的边界,设置状态为 OUT
        if (c == ' ' || c == '\n' || c == '\t')
        {
            state = OUT;
        }
        else if (state == OUT)  // 如果当前不是在单词内部,说明上一个单词已经结束,现在开始一个新单词
        {
            state = IN;
            nw++;  // 单词数加1
        }
    }

    // 输出字符数,行数,单词数
    printf("%d %d %d \n", nc, nl, nw);
}

你可能感兴趣的:(#,C_习题,c语言,开发语言)