您的位置:首页 > 其它

putchar()和getchar()函数的一些简单实用实例!

2011-01-11 22:30 344 查看
单个字符输入:getchar()函数是用来从文本流中获得一个字符,并把获得的字符作为函数值返回。

单个字符输出:putchar(c)是讲整型变量(字符)c的内容以字符的形式打印出来,通常是显示在屏幕上。

1.一次输入一个字符,并依次把输入的字符输出。

#include<stdio.h>
main()
{
int c;
c=getchar();//getchar()函数得到一个从键盘上输入的字符,并把得到的字符作为函数值返回送给整型变量c
while(c!=EOF)//EOF是一字符常量,值为-1,作为文本文件结束的标志(以EOF为结束标志的文件必须是文本文件,二进制文件不行)
{
putchar(c);//得到的字符通过putchar()函数输出到屏幕上
c=getchar();//读入下一个字符
}
}

2.统计输入的字符数.

for循环写的:

#include<stdio.h>
main()
{
int n;//n里面存放的是输入字符的总个数
for(n=0;getchar()!=EOF;n=n+1)
;
printf("输入字符的个数:n=%d/n",n);
}

while循环写的:

#include<stdio.h>
main()
{
int n;
n=0;

while(getchar()!=EOF)
++n;

printf("输入字符的个数:n=%d/n",n);
}

对于这两个程序,刚开始本人以为程序方面有问题,因为编译完运行输入一行字符如abcd后,确没有输出结果,查了下资料,原来是出在对EOF文件结束符的理解上,在windows平台上文件结束快捷键为Ctrl+Z。

(1)如我们输入字符串abcd后怎样得到统计处的字符个数呢,输入 abcd后按回车键,再输入Ctrl+Z回车,这是大家看到n变为了5,即输入的字符个数为5(换行符也是一个字符):



(2)如果要统计不包括换行符的个数,可以在连续输入字符之后,输入Ctrl+Z(相当于换行符的功能),换行后在输入Ctrl+Z,则可得到结果,如运行程序输入abcd,输入Ctrl+Z,换行后在输入Ctrl+Z,回车后则得到结果如下:



附上网络找的资料对此的解释。

1.EOF作为文件结束符时的情况:
EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl+Z都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。
(1)遇到getcahr函数执行时,要输入第一个字符时就直接输入Ctrl+Z,就可以跳出getchar(),去执行程序的其他部分;
(2)在前面输入的字符为换行符时,接着输入Ctrl+Z;
(3)在前面有字符输入且不为换行符时,要连着输入两次Ctrl+Z,这时第二次输入的Ctrl+Z起到文件结束符的功能,至于第一次的Ctrl+Z的作用将在下面介绍(测试时好像不行)。

测试如下:



其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时,直接输入Ctrl+Z才相当于文件结束符。
(4)2.EOF作为行结束符时的情况,这时候输入Ctrl+Z并不能结束getchar(),而只能引发getchar()提示下一轮的输入。
这种情况主要是在进行getchar()新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入Ctrl+Z,此时的Ctrl+Z并不是文件结束符,而只是相当于换行符的功能,即结束当前的输入。
3.自己改写的统计输入字符个数的程序(已测试直接复制可以使用)

#include<stdio.h>
main()
{
int n,c;
n=0;
c=getchar();
while(c!=EOF)
{
n=n+1;
c=getchar();
if(c=='/n')//以换行符号作为结束标志
printf("%d",n);
}
}

下面的更简洁(测试成功vc++6.0):

#include<stdio.h>
main()
{
int n=0;//n里面存放的是输入字符的总个数
while(getchar()!='/n')
++n;
printf("%d/n",n);
}

4.统计输入字符中的行数,程序如下:

#include<stdio.h>
main()
{
int n,c;
n=0;
while((c=getchar())!=EOF)
if(c=='/n')
++n;
printf("输入的行数:n=%d/n",n);
}

输入好任意几行字符后,换行,在输入Ctrl+Z(文件结束的快捷键),回车可得到结果,如输入以下4行字符得到结果如下:



5.编写一个统计空格,制表符,与换行符个数的程序:
#include<stdio.h>
main()
{
int n,c;
n=0;
while((c=getchar())!=EOF)
if(c==' '||c=='/n'||c=='/t')
++n;
printf("输入的空格或制表符或换行符的个数为:n=%d/n",n);
}
如一次输入字母和空格后,换行,输入Ctrl+Z,回车,得到结果如下(包括了换行符):



6.编写一程序用于统计行数,单词数和字符数(包括换行符),其中单词的定义为任何其中不包括空格,制表符或换行符的字符序列,程序如下:
#include<stdio.h>
#define OUT 0 //代表在单词外
#define IN 1 //代表在单词内
main()
{
int c,nl,nw,nc,state;
state=OUT;//state变量用来记录程序当前是否处于一个单词之中,初值为OUT表示不在单词之中
nl=nw=nc=0;
while((c=getchar())!=EOF)
{
nc=nc+1;//nc统计字符个数
if(c=='/n') nl=nl+1;//nl统计行数
if(c==' '||c=='/n'||c=='/t')state=OUT;
else if(state==OUT)
{
state=IN;
nw=nw+1;//nw统计单词个数
}
}
printf("行数=%d/n单词个数=%d/n字符个数=%d/n",nl,nw,nc);
}



7.编写一程序,统计各个数字,空白符(包括空格符,制表符和换行符)以及所有其他字符出现的次数。
思路:按题意,所有字符可以分为12类,0-9十个字符为数字字符,空白符为一类,以及其他字符为另一类,为表示方便,可以用一个数组来存放各个数字出现的次数,程序如下:
#include<stdio.h>
main()
{
int c,i,nwhite=0,other=0,ndigit[10];
for(i=0;i<=9;i=i+1)
ndigit[i]=0;//动态方式给数组初始化赋值
while((c=getchar())!=EOF)
{
if(c>='0'&&c<='9')
++ndigit[c-'0'];//统计各个数字出现的次数,任意一字符出现,则数组元素中相应的数字加1
else if(c==' '||c=='/n'||c=='/t')
++nwhite;//条件成立,则空白符的字数加1
else
++other;//前两个条件都不成立,则其他字符个数增加1
}
printf("digits=");
for(i=0;i<=9;i++)
printf(" %d",ndigit[i]);
printf(",white space=%d,other=%d/n",nwhite,other);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: