getchar 与 putchar

 借助getchar与putchar函数,可以在不掌握其他输入输出知识的情况下编写出许多有用的代码。最简单的程序是一次一个字符地把输入复制到输出,其基本思想如下:

读一个字符
while ( 该字符不是文件结束指示符)
输出刚读进的字符
读下一个字符


下面是其C程序:
#include <stdio.h>
/* 用于将输入复制到输出的程序;第1个版本*/
main()
{
     int c;
    c = getchar();
     while  c != EOF) {
        putchar(c);
        c = getchar();
    }
}

像其他许多东西一样,一个字符不论在键盘或屏幕上以什么形式出现,在机器内部都是以位模式存储的。char类型就是专门用于存储这种字符数据的类型,当然任何整数类型也可以用于存储字符数据。由于某种微妙却很重要的理由,此处使用了int类型。

需要解决的问题是如何将文件中的有效数据与文件结束标记区分开来。C语言采取的解决方法是, getchar函数在没有输入时返回一个特殊值,这个特殊值不能与任何实际字符相混淆。这个值叫做EOF(End Of File,文件结束)。必须把c说明成一个大到足以存放getchar函数可能返回的各种值的类型。之所以不把c说明成char类型,是因为c必须大到除了能存储任何可能的字符外还要能存储文件结束符EOF。因此,把c说明成int类型的。

EOF是一个在<stdio.h>库中定义的整数,但其具体的数值是什么并不重要,只要知道它与char类型的所有值都不相同就行了。可以通过使用符号常量来保证EOF在程序中不依赖于特定的数值。

#include <stdio.h>
/* 用于将输入复制到输出的程序;第2个版本*/
main ( )
{
     int c;
     while ( (c = getchar ( ) ) != EOF )
        putchar ( c );
}

在这一程序中,while循环语句先读一个字符并将其赋给c,然后测试该字符是否为文件结束标记。如果该字符不是文件结束标记,那么就执行while语句体,把该字符打印出来。再重复执行该while语句。当最后到达输入结束位置时,while循环语句终止执行,从而整个main程序执行结束。

#include <stdio.h>
#define  IN 1  /* 在单词内*/
#define  OUT 0  /* 在单词外*/
/* 统计输入的行数、单词数与字符数*/
main ( )
{
     int c, nl, nw, nc, state;
    state =  OUT;
    nl = nw = nc = 0;
     while ( (c = getchar ( ) ) != EOF ) {
        ++nc;
         if ( c =='/n' )
            ++nl;
         if ( c == ' ' ||c == '/n' || c == '/t' )
            state =  OUT;
         else  if ( state ==  OUT ) {
            state =  IN;
            ++nw;
        }
    }
    printf( "%d %d %d/n", nl, nw, nc);
}


注: "stdio.h" 里定义的 EOF 宏值为(-1)

编写一个程序,把它的输入复制到输出,并在此过程中将相连的多个空格用一个空格代替。
void main()
{
     char c;
     int i = 0;
     while((c = getchar())!= EOF)
    {
         if(c == ' ')        
        {
            i++;
             if(i > 1)
                 continue;
        }
         else
            i = 0;
        putchar(c);
    }
}

你可能感兴趣的:(c,测试,存储,语言)