常见的输入输出函数如下,下面分别介绍:
getchar() //从键盘上输入一个字符常量,此常量就是该函数返回的值;
putchar() //把变量中的一个字符常量输出;
scanf() //从键盘上输入各类数据,并存放到程序变量中;
printf() //把键盘中的各类数据,加以格式控制输出;
gets() //读入一行字符串常量并放到程序的数组中;
puts() //把数组变量中的一个字符串常量输出,并且带有回车'\n';
sscanf() //从一个字符串中提取各类数据到buffer;
sprintf() //将各类数据写入字符串中;
1.格式化输出函数printf()
它是向标准设备输出格式化标准的信息,它的原型是:printf(“格式化字符串”,“参量表”);格式化字符串可分为两部分:一是正常字符,会按原样输出,二是格式化规定字符,以%+规定字符来规定输出内容的格式
参量表里面是各种输出变量,用“,”隔开,与格式化规定字符一一对应,数目必须一样。
格式化字符串
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%e 指数形式的浮点数
%0 无符号以八进制表示的整数
%g 自动选择合适的表示法
说明: (1). 可以在”%”和字母之间插进数字表示最大场宽。
(2). 可以在”%”和字母之间加小写字母l, 表示输出的是长型数( %ld 表示输出long整数 %lf 表示输出double浮点数 )
一些特殊规定字符
\n 换行
\f 清屏并换页
\r 回车
\t Tab符
2.格式化输入函数scanf()
它的原型是 int scanf(“格式化字符串”,“参量表”);成功返回读入的数据项数,失败则返回EOF,第一个参数和printf一样,第二个参数是读一个地址,int 型的需加&,是表示地址的字符串数组本身表示地址,不用加&。
例如:
scanf(“%d%d%d”,&a,&b,&c);
&a,&b,&c中的&是寻址操作符,如果scanf中%d是连着写的,如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔,只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”,如“2,3,4”。
注意事项
(1)在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符,包括空格,回车\n.若有,则是按规则输入。
如:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char c1,c2,c3;
scanf("%c%c%c",&c1,&c2,&c3);
printf("%c\t%c\t%c\n",c1,c2,c3);
return 0;
}
输入\n结果是:
[root@localhost gongxiang]# ./a.out
a
b
a
b
输入空格结果是:
[root@localhost gongxiang]# ./a.out
a b c
a b
这是因为把a后面的空格回车当作字符赋给了c2,当输完b后的回车scanf就结束了。如果是scanf(“%c %c %c”,&c1,&c2,&c3);则可以输入空格,同理,回车也可以。
有没有可以解决这个问题呢,答案是肯定的
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char c1,c2;
scanf("%c",&c1);
getchar();
scanf("%c",&c2);
printf("%c %c\n",c1,c2);
return 0;
}
结果为:
[root@localhost gongxiang]# ./a.out
a c
a c
由getchar()接收a后的空格即可
(2)在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12x”时,x即为非法数据)时即认为该数据结束。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int c1,c2,c3;
scanf("%d%d%d",&c1,&c2,&c3);
printf("%d\t%d\t%d\n",c1,c2,c3);
return 0;
}
输出结果为:
[root@localhost gongxiang]# ./a.out
12 23 34
12 23 34
当遇到空格就认为就一个参数输入结束,舍弃空格,开始接受下一个,这是跟输入字符不一样的地方。
(3) scanf中要求给出变量地址,给出变量名则会出错,如 scanf(“%d”,a);是非法的,应改为scanf(“%d”,&a);才是合法的。 对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上”&”操作符。
(4) 可以在格式化字符串中的”%”各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。但是 scanf函数中没有类似printf的精度控制。如: scanf(“%5.2f”,&a); 是非法的。
(5) 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char c1,c2,c3;
scanf("%c,%c,%c",&c1,&c2,&c3);
printf("%c\t%c\t%c\n",c1,c2,c3);
return 0;
}
[root@localhost gongxiang]# ./a.out
a,b,c
a b c
(6)输入为字符串时,也是在格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12x”时,x即为非法数据)时即认为该数据结束。
下面请看一个例子:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char str[20];
char str1[20];
char str2[20];
scanf("%s",&str);
printf("%s\n",str);
scanf("%s",&str1);
scanf("%s",&str2);
printf("%s\n",str1);
printf("%s\n",str2);
return 0;
}
在终端运行时结果:
[root@localhost gongxiang]# ./a.out
I love you
I
love
you
从结果可以看出,输入字符串时,当遇到空格结束扫描,str里只存放了I,当再定义两个数组去存放时,不需要再输入了,这是因为输入的字符串放在了stdin流中,当下一次遇到scanf时,会直接从输入流中取出数据。
那有没有什么方法可以解决呢,只需要用%[…..]即可,这个用的很少,但是很有用
上面的例子可以改为:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char str[20];
scanf("%[^\n]",&str); [^\n]是指scanf接收除了\n之外的一切字符
printf("%s\n",str);
return 0;
}
结果为:
[root@localhost gongxiang]# ./a.out
I love you
I love you
3.单个字符输入函数getchar(),输出函数putchar()
char getchar(char) 从键盘输入一个数据,返回输入的数据,getchar也会将回车,空格,等读进去。跟用scanf输入单个字符一样。
putchar(ch) 单个字符输出函数,其中ch可以是一个字符变量或常量,也可以是一个转义字符。
这两个比较简单,就不多说
4.字符串输入函数gets(),输出函数puts()
char *gets(char *s); gets函数可以无上限的从键盘读入数据,直到遇到换行或者EOF为止,存进s所指的缓冲区中,这就需要缓冲区足够大,否则会溢出,溢出的数据会存到堆栈中,会对数据产生很大的影响,最后会舍弃读入的\n,会被自动转化为\0,所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。EOF对应的值是-1.
int puts(char *string); puts()函数用来向标准输出设备(屏幕)写字符串并换行,遇到\0结束,puts()与gets()相反,puts会把接收到的字符串最后一个\0转化成换行
(1). puts()函数只能输出字符串, 不能输出数值或进行格式变换。 (2). 可以将字符串直接写入puts()函数中。如: puts(“Hello, Turbo C2.0”);
5.字符串格式化函数sprintf()
把格式化的数据写入某个字符串缓冲区。
int sprintf( char *buffer, const char *format, [ argument] … );
参数列表
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。与printf()函数一样。
返回值
返回写入buffer 的字符数,出错则返回-1. 如果 buffer 或 format 是空指针,不出错而继续,函数将返回-1,并且 errno 会被设置为 EINVAL。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char buffer[1024];
int count=sprintf(buffer,"this is a buffer %s","12345678");
printf("buffer=%s ,count=%d\n",buffer,count);
char str[18]="abcdefg";
count=sprintf(buffer,"this is a buffer2 %s",str);
printf("buffer=%s ,count=%d\n",buffer,count);
return 0;
}
运行看结果:
[root@localhost gongxiang]# ./a.out
buffer=this is a buffer 12345678 ,count=25
buffer=this is a buffer2 abcdefg ,count=25
scanf()是与sprintf()相反的过程,从缓冲区取数据到相应的结构,用的不多,这里就不多说了,相信大家都已经理解了吧