使用getchar、putchar函数完成cat以及wc命令功能

C语言中的getchar以及putchar函数配合使用,可以完成许多非常有用的功能。比如今天要说的类似于linux命令cat、wc功能。

  • getchar函数用于从标准输入中读取一个字符,每读取一个字符后,指针向下移动。如果遇到了字符为EOF则表示标准输入流里字符已全部读取完毕。
  • putchar函数用于向标准输出中输入一个字符

cat

实现该功能比较简单,每次使用getchar读取一个字符后,就使用putchar打印该字符即可。

#include <stdio.h>

int main (void)
{
    int c;

    while ((c = getchar()) != EOF) {
        putchar(c);
    }

    return 0;
}

演示效果如下:

 ./c_cat < cat.c 
#include <stdio.h>

int main (void)
{
    int c;

    while ((c = getchar()) != EOF) {
        putchar(c);
    }

    return 0;
}

wc

统计字符数以及行数比较简单,但统计单词数就比较复杂一点。统计单词思路如下:定义两种状态 单词中单词外。每当状态从单词外变为单词中的时候,单词数就+1.

#include <stdio.h>

#define IN_WORD 1
#define OUT_WORD 0

int main (void)
{
    int c;
    int state = OUT_WORD;
    int nc, nw, nl;

    nc = nw = nl = 0;

    while ( (c = getchar()) != EOF) {
        nc++;

        if (c == '\n') {
            nl++;
        }

        if (c == '\n' || c == '\t' || c == ' ') {
            state = OUT_WORD;
        } else if (state == OUT_WORD) {
            state = IN_WORD;
            nw ++;
        }
    }

    printf("chars:%d,words:%d,lines:%d\n", nc, nw, nl);
    return 0;
}

演示效果如下:

# ./c_wc <<eof
> Hello, c language.
> You are my hero.
> java php
> linux mysql
> eof
chars:57,words:11,lines:4
Posted in: C