7.1 标准输入/输出
getchar()是最简单的输入机制,每次从标准输入中一次读取一个字符;int getchar(void);
输入一般来自键盘,可以重定向从文件中,比如prog是一个prog<infile将从infile中读取输入。
putchar()用于输出数据。int putchar(int),它返回输出的字符,如果失败则返回EOF。
同理可以重定向输出,如prog>outfile。
事实上getchar()与putchar()在头文件stdio中都是宏,并不是真正的函数。
7.2 格式化输出——printf函数
printf的原型为:int printf(char *format,arg1,arg2, …);
在转换说明中,宽度或精度可以用星号*表示,这时,宽度或精度的值通过转换下一参数(必须为int)来计算。例如,为了从字符串s中打印最多max个字符,可以使用下列语句:
printf("%.*s",max,s);
上面语句中max是一个变量,打印s中最多max个字符。
sprintf函数格式转换功能与printf一样,但是它将输出保存在一直字符串中。
int sprintf(char *string,char *format,arg1,arg2,…);
7.3 变长参数表
这里实现了一个简化的printf函数minprintf
7.4 格式化输入——scanf函数
int scanf(char *format, …)
函数返回成功匹配并赋值的输入项的个数。
另一个sscanf用于从一个字符串中读取字符序列。
int sscanf(char *string, char *format, arg1, arg2,…);
它按照format中规定的格式扫描字符串string,并把结果分别保存到arg1,arg2这些参数中,这些参数必须为指针。
如果scanf的转换说明中的赋值禁止符*,则跳过该字段,不进行赋值。
如果要读取格式不固定的输入,最好每次读入一行,然后再用sscanf将合适的格式分离出来读入。例如,我们需要读入一些包含日期的输入行,日期的格式可能是以下任一种形式。
18 Oct 2013
10/18/2013
while(getline(line,sizeof(line)) > 0) { if(sscanf(line,"%d%s%d",&day,month,&year)==3) printf("valid:%s\n",line); else if(sscanf(line,"%d/%d/%d",&month,&day,&year)==3) printf("valid:%s\n",line); else printf("invalid:%s\n"