C语言中的getchar, scanf, putchar, printf学习

输入和输出功能并不是C语言本身的组成部分,他们属于标准库范围,使用输入输出相关函数是必须写:#include<stdio.h> 。文件名用尖括号括起来时,预处理器将到特定位置查找而不是在工程中。

 

常用的标准的输入输出有:

getchar(void), scanf(char *format, …); putchar(c),   printf(char*format, arg1, arg2 ,…)

 

C语言中,用Dos窗口输入数据时,长度满足输入函数要求并且按下了回车键才能结束本次输入。如果长度满足(包括超出)没有按下回车键,继续等待输入直到按下回车键,如果按下回车键但长度没有达到要求,继续等待输入,直到长度满足要求并且按下回车键。

输入结束后,输入函数接收完所需要的数据或者无法与输入数据匹配时结束(终止)执行。

超出的输入数据(包括回车符)停留在缓存中,等到下一次有输入函数时,传递给输入函数。

在char型的输入中空格、回车、换行等都当成字符处理。

而整形相关输入中,数据边界定义为下一个非数字字符或者指定的字符宽度,在非数字字符中,只有空白符(包括空格、制表符、回车、换页符)可以被自动被忽略。

 

输入:

 

int getchar(void)

从标准输入中(一般为键盘)一次读取一个字符,空格回车等都当成一个字符,是最简单的输入机制。

返回:调用时输入字符的ASCII值,遇到文件结尾,返回EOF(符号常量,一般为-1)。

使用“prog <输入文件名”实现输入重定向(改变输入源,例如把键盘输入改成文件输入)

文本流有一系列行组成,每一行的结尾是换行符,如果系统不遵行这种模式,标准库将其转变为该种模式,例如输入端把回车符和换页符都转换为换行符,输出端反向变换。

 

int scanf(char *format, …)

按照format的格式读入字符,存储在后面参数所代表的地方,因此后面的参数一定是地址(指针)。

返回:成功匹配并赋值的输入项个数,遇到文件结尾,返回EOF,下一个字符与格式说明不匹配,返回0(EOF与0不是同一个概念)

扫描完字符串或者碰到某些输入无法与控制字符匹配时,函数终止

 

intsscanf(char *string, char *format, arg1, arg2, …)

按照format格式扫描string中的字符,保存在arg1,arg2中,arg1,arg2也必须是地址(指针)。其他与scanf相同

文本流有一系列行组成,每一行的结尾是换行符,如果系统不遵行这种模式,标准库将其转变为该种模式,例如输入端把回车符和换页符都转换为换行符,输出端反向变换。

 

Format由三部分组成,”<空格制表符(通常省)> <普通字符(可省)> <转换说明(不可省)>”

空格和制表符在处理过程中被忽略。

普通字符(不包括%),用来严格的和输入流中的数据不对,若不相同,则后面的不能输入。

转换说明包括:

% <禁止符*(可省)> <数值(最大宽度,可省)> <h, l或L(对象宽度,可省)> <转换字符>

转换说明中有赋值禁止字符*,跳过该输入字段,不进行赋值。

执行scanf获得的数据个数由转换字符的个数决定。

转换字符含义参考其他说明。

 

输出:

 

int putchar(c)

函数putchar(c)将字符c送到标准输出上,默认情况下是显示屏。

返回:输出的字符,发生错误则返回EOF

使用“>输出文件名”实现输出重定向(改变输出地,例如把输出到屏幕改为某个文件)

文本流有一系列行组成,每一行的结尾是换行符,如果系统不遵行这种模式,标准库将其转变为该种模式,例如输入端把回车符和换页符都转换为换行符,输出端反向变换。

 

int printf(char *format, arg1, arg2 ,…)

在format的控制下打印。

返回:打印的字符数。

 

int sprintf( char *string, char*format, arg1, arg2, …)

功能与printf相同,但是输出到string中而不是标准的输出中,要保证string足够大。

文本流有一系列行组成,每一行的结尾是换行符,如果系统不遵行这种模式,标准库将其转变为该种模式,例如输入端把回车符和换页符都转换为换行符,输出端反向变换。

 

Format由两部分组成,”普通字符、转换说明”

普通字符直接输出到数据流里

转换说明不直接打印,控制printf中参数的转换和打印,格式为“%<格式控制>字符”

其中格式控制符为 -x.x样式,控制对其方式、宽度、精度(输出长度)等,字符控制输出的格式。

 

例:输入n(n不超过100)个整数,各个整数用逗号隔开。

方法一:

思路:利用getchar()函数逐个字节(字符)输入,找出逗号的位置。然后将逗号之间的字符转换成整形数放到数组里。

char str[100] = {0};

int num[50] = {0};

char comma[50] = {0};        

char i = 0,j = 0,k = 0;

 

str[i] = getchar();                //下面的输入是从str[1]开始,这里

while(10 != str[i++]){             //以回车符结束输入

str[i] = getchar();

if(str[i] == 44){                //记录逗号的位置

         comma[j++] = i;

}

}

comma[j] = i - 1; //i是回车符的位置(判断的时候执行了++),相当于最后一个逗号,j从开始,j+1为字符串中整数的个数

num_real = j;                   

for(i=(comma[0]-1);i>=0;i--)

num[0] = num[0] + (str[i]-48)*pow_self(++k);                      //解决第一个数,j=0无法确定下限       

k = 0;

for(;j>=1;j--){

for(i=(comma[j]-1);i>comma[j-1];i--)

num[j] = num[j] + (str[i]-48)*pow_self(++k);                      //num从开始,共j+1个数

          k = 0;

}

 

其中pow_self函数定义为:

int pow_self(char num)

{

   int cnt;

   int sum = 1;

   for(cnt =1;cnt<num;cnt++)

       sum = sum*10;

   return sum;

}

 

方法二:

Scanf和getchar配合,getchar负责接收逗号,逗号拥有空白符的功能。

int a[5] = {0};

int i = 0;

 

scanf("%d",&a[0]);

while(10 != getchar())         scanf("%d",&a[++i]);

 

方法三:

巧妙的利用scanf,依次扫描2个数,分别为整形和char型,char只是用来判断结尾

int a[5] = {0};

int i = 0;

char b = 0;

 

while(b != 10)

         scanf("%d%c",&a[i++],&b);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值