当前位置:文档之家› 关于输入输出函数

关于输入输出函数

gets()函数,我们已经知道,将第一个换行符之前的所有字符读入。
scanf()函数与其说读入一个串不如说读入一个词。
scanf()有两种选择。对每一种选择来说,串都从遇到的第一个非空白字符开始读入
例:
char ch[17]="You are welcome!";
int i,j,z;
for(i=0;i<17;i++){
然后输入的时候,随便输入回车、空格、制表符,然后“回车”确认。
会发现程序依然提示等待你输入。
就是因为它忽略掉所有前导空白符之后发现缓冲区是空的!于是乖乖地阻塞住,等待你输入。
关于scanf是直到看见空白符结束读取这一点,如果你是初学C的话,那么很快你就会遇到另一个函数,叫gets()。
程序里如果我们想一次读入一个英文句子:
空格字符。
%f转换成实数。
%.Nf同上。转换后的实数包含N个小数,不足部分在右部补字符0。
%M.Nf同上。转换后的实数共包含M个字符,小数为N个,不足部分在
右部补字符0。小数点和可能有的数据符号各占用一个字符,其余
为整数,不足部分在左部补空格字符。
%c转换成ASCII码与表达式的值相等的字符。
%s取首地址等于表达式值的字符串。
3.字符串比较──strcmp()函数
(1)调用方式:strcmp(字符串1 ,字符串2)其中“字符串”可以是串常量,也可以是1维字符数组。
(2)函数功能:比较两个字符串的大小。如果:字符串1=字符串2,函数返回值等于0;字符串1字符串2,函数返回值正整数。如果一个字符串是另一个字符串从头开始的子串,则母串为大。不能使用关系运算符“==”来比较两个字符串,只能用strcmp()函数来处理。
函数原型:char* gets(char *s)
参数说明:s字符串的存贮地址。
功能说明:从标准输入设备上接收一个字符串存贮到从s起的内存区
域中。按下回车键时字符串的输入完成,换行符被换成字
符串结束记号'\0'。
返回值:输入成功时返回字符串的存贮地址s,否则返回NULL。
库函数puts
函数原型:char* puts(char *s)
执行:
scanf("%s",name);
的时候,由于scanf是读数据直到看见空白符(空白符:指空格符、制表符、回车符)就停止的输入函数。所以执行后,把abcd存到了name中。缓冲区于是变成了
\n1234\n
接下来的执行就有问题了,如果遇到了:
scanf("%d",&number);
怎么办?因为遇到了回车符,它并不是一个数字,所以应该抛出错误,让程序死掉?不对吧,明明是编程序的你让用户输入完名字回车的(不然怎么提示用户该输入数字了?),怎么能出尔反尔地报错呢?
printf("*");
}
printf("\n");
for(j=0;j<18;j++){
printf("%c",ch[j]);
}
printf("\n");
for(z=0;z<17;z++){
printf("-");
}
printf("\n");
puts(ch);
printf("%s\n",ch);
char ch[17];
%Ns同上。若字符串长度小于N,不足部分在左部补空格字符。
Scanf("%s",&name)与回车
想象输入设备(键盘)连接着一个叫“缓冲”的东西,把缓冲认为是一个字符数组。当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住,等待你从键盘输入。
现在假设你的缓冲区里有:
abcd\n1234\n (其中\n是回车符)
参数说明:format确定输入数据的解释方式的格式字符串。
a1,a2,…,an n个变量地址(n>=1)。
功能说明:按格式字符串中输入数据的解释方式,把从标准输入设备上接
到收的第i个外部形式的数据,转换成内部形式的二个相邻的输入数据可用空格、制表符或回车分隔。
返回值:转换成功并存贮到变量中的数据个数。
2.输出字符串──puts()函数
(1)调用方式:puts(字符数组)
(2)函数功能:把字符数组中所存放的字符串,输出到标准输出设备中去,并用‘\n’取代字符串的结束标志‘\0’。所以用puts()函数输出字符串时,不要求另加换行符。字符串中允许包含转义字符,输出时产生一个控制操作。该函数一次只能输出一个字符串,而printf()函数也能用来输出字符串,且一次能输出多个。
注:常用输入数据的解释方式
%d10进制整数。
%ld10进制长整数。
%f单精度实数。
%lf双精度实数。
%1s一个字符。
%s字符串。
库函数printf
函数界面:int printf(char *format,e1,e2,…,en)
参数说明:format确定输出格式的格式字符串。
e1,e2,…,en n个表达式(n>=0)。
于是你输入了"abc",然后“回车”。
缓冲区里自然而然地是:
abc\n
scanf把abc拿走了,留下了\n,缓冲区里现在就剩下\n
于是,下一个scanf ("%c",&sex);想当然地读取了\n
明白了?
关于scanf忽略前导空白符这一点,可以这样验证:
写个程序,用scanf()读数据,只要不是%c就行。
得承认,这是个缺陷,但不是说这样不好。
这样的设计至少把发现所有字符的机会交给了用户,
设计者这样想:
如果程序员使用了scanf("%c",..),那他就有必要知道这函数能把回车符读出来,至于程序员对回车符感不感兴趣,那就看他了,不感兴趣的话,程序员也一定知道该怎么处理。
回到你的程序里。
当执行scanf("%s",name)的时候,要求你从键盘输入,
}
printf("\n");
puts(ch);
printf("%s\n",ch);
char ch[8];
int i;
scanf("%s",&ch);
for(i=0;i<17;i++){
printf("*");
}
printf("\n");
printf("%s\n",ch);
想法是好的,可这只针对你的程序这一种情况。如果我编写的程序就是统计用户输入了多少个回车呢?缓冲里明明有回车符,却读不出来,你不是忽悠我吗?
所以对scanf来讲跳过前导空白符有个例外,当参数是%c的时候,就把缓冲区的第一个字符返回回去,不管是什么。
这样的设计就有个问题,scanf对不同的参数表现出来的特性不一样。
功能说明:把表达式ei的值按格式字符串中的第i个格式指示转换成外
部形式的数据(一串字符),用以取代格式字符串中的第i个
格式指示。
向标准输出设备输出所有转换完成后的格式字符串。
返回值:输出的字节数。
注:常用输出格式指示(下面的M、N均为正整数常量)
%d转换成10进制整数。
%Nd同上。转换后的10进制整数包含N个字符,不足部分在左部补
返回值:输入成功时返回字符的ASCII编码值,否则返回-1。
库函数putchar
函数原型:int putchar(int ch)
参数说明:ch被输出的字符的ASCII编值。
功能说明:向标准输出设备上输出一个字符。
返回值:输入成功时返回该字符的ASCII编码值,否则返回-1。
2.字符串输入/输出函数
库函数gets
1.输入字符串──gets()函数
(1)调用方式:gets(字符数组)
(2)函数功能:从标准输入设备(stdin)──键盘上,读取1个字符串(可以包含空格),并将其存储到字符数组中去,并用空字符(\0)代替s的换行符。gets()读取的字符串,其长度没有限制,编程者要保证字符数组有足够大的空间,存放输入的字符串。如果调用成功,则返回字符串参数s;如果遇到文件结束或出错,将返回null。该函数输入的字符串中允许包含空格,而scanf()函数不允许。
int i,j,z;
gets(ch);
for(i=0;i<17;i++){
printf("*");
}
printf("\n");
for(j=0;j<strlen(ch);j++){
printf("%c",ch[j]);
}
printf("\n");
for(z=0;z<17;z++){
printf("-");
I am a student.
如果你用scanf读的话,只能读出"I",想读出后面的东西要不断调scanf。
此时需要用gets,这个函数不管是什么一律读进来,直到遇到回车符才停下。
总之,各有各的用途,全都熟悉之后,才能在恰当的时候恰当地使用。
Scanf()与gets()函数的区别:
scanf()函数和gets()函数之间的主要区别在于它们判断一个串结尾的方式不同。
参数说明:s字符串的存贮地址。
功能说明:从标准输入设备上接收一个字符串存贮到从s起的内存区
域中。按下回车键时字符串的输入完成,换行符被换成字
相关主题