输入和输出功能并不是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);