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