程序一般会采用某种形式进行字符的输入输出,下面我们来学习字符和输入输出的关系。
在前面的学习中我们知道一个进行字符输出的putchar函数,接下来我们学习一个关于字符输入的getchar函数,灵活使用这些函数就可以进行将字符输入直接输出的操作了。
我们需要使用一段代码来具体的演示上面的功能:
#include<stdio.h>
int main()
{
int ch;
while((ch = getchar()) != EOF)
putchar(ch);
return 0;
}//按下Ctrl+z结束循环
getchar函数的功能是读取字符并将其返回,输入结束或读取过程发生错误就会返回EOF值。
getchar函数 | |
头文件 | #include<stdio.h> |
原型 | int getchar( ) |
说明 | 从标准输入流中读取下一个字符(若存在) |
返回值 | 返回读入的字符,读到文件夹末尾或发生错误,返回EOF |
对象式宏EOF的名称来源于END OF FILE,在<stdio.h>头文件,EOF被定义为负值,如下:
#define EOF -1
如果未将<stdio.h>头文件包含进来,那么EOF就没有定义,这时程序不能编译和运行
本程序实际上只是由while语句构成:
(ch = getchar()) != EOF
先看这个语句执行的结构图:
下面我们对该图进行解释:
?1处将读取的字符赋值给ch,但是当输入结束或者发生某种错误时,ch就会被赋值给EOF
?对赋值表达式进行判断后,会得到赋值后左操作数的类型和值,因此ch = getchar()等价赋值后的ch,在2处会比较该值和EOF
?这样一来,只要读取的字符没有问题,就会执行while语句的循环体,并通过putchar函数显示字符,当输入结束或者发生某种错误时,while语句执行结束。
如果不使用控制表达式来表示赋值和比较,则while语句如下:
while(1)
{
ch = getchar();
if(ch == EOF)
break;
putchar(ch);
}
在需要对象式宏EOF的程序中,如果不包含<stdio.h>头文件,进行如下定义式是不行的:
#define EOF -1
因为EOF岁规定为负,但不一定是-1,在EOF的值不为-1的编译器或运行环境中,进行手动定义程序时难以保证编译和运行结果的正确性。
输入字符,计算各字符出现的次数:
#include<stdio.h>
int main()
{
int i, ch;
int cnt[10] = {0};
while((ch = getchar()) != EOF )
{
switch(ch)
{
case '0':cnt[0]++; break;
break;
case '1':cnt[1]++; break;
break;
case '2':cnt[2]++; break;
break;
case '3':cnt[3]++; break;
break;
case '4':cnt[4]++; break;
break;
case '5':cnt[5]++; break;
break;
case '6':cnt[6]++; break;
break;
case '7':cnt[7]++; break;
break;
case '8':cnt[8]++; break;
break;
case '9':cnt[9]++; break;
break;
}
}
printf("数字字符出现的字符\n");//记得输入完数字字符后按下Ctrl+z后再次按下回车
for(i = 0; i < 10 ; i++)
printf("'%d': %d\n", i, cnt[i]);
return 0;
}
我们接下来进行解释:
字符出现的次数储存在int[10]型数组cnt中,字符‘0’,‘1’……‘9’出现的次数分别储存在cnt[0]、cnt[1]……cnt[0]中。
因为while语句的循环体是Switch语句,所以当getchar函数的返回值不为EOF时,正确读入字符,进入Switch语句。
Switch语句对上面十个语句进行处理会显得比较冗长,另外与各个字符对应的数组cnt的元素会递增,例如:
ch为‘0’,则cnt[0]的值递增,如果ch为‘1’,则cnt[1]的值递增。
数组cnt的作用是保存数字字符‘0’—‘9’的出现次数,下标也是0—9,因此只要将数字字符转换为对应的下标值就能更简单的实现目标
如数字字符‘0’可以转换为整数0,数字字符‘9’转换为整数9
发烧了,难受死我了,下一部分等有时间再写吧