vs常量中有换行符怎么解决 scanf使用前怎么定义?
scanf使用前怎么定义?
简介scanf函数,与sprintf函数一样的,都被定义在stdio.h里,因此在可以使用scanf函数时要另外#include。它是格式键入函数,即按用户委托的格式从键盘上把数据输入到重新指定的变量之中,其关键字最末一个字母f即为“格式”(format)之意。[编辑本段]sprintf函数的好象形式scanf(格式控制,地址表列)
intscanf(char*format[,argument,...])
“格式控制”的含义同sprintf函数;“地址表列”是由若干个地址排成的表列,是可以是变量的地址,或字符串首地址。
scanf()函数返回最终定义变量的数据项数,出错时则返回EOF。
例:使用sscanf函数然后输入数据。
#include
voidmain()
{
inta,b,c
printf(#34inputa,b,c
#34)
scanf(#34%d%d%d#34,a,b,c)
printf(#34a%d,b%d,c%d#34,a,b,c)
}[编辑本段]格式字符只能证明%a,%A输入数据一个浮点值(仅C99快速有效)
%c数据读入一个字符
%d输入数据十进制整数
%i写入到十进制,八进制,十六进制整数
%o读入八进制整数
%x,%X读入十六进制整数
%c读取数据一个字符
%s数据读入一个字符串,遇空格、制表符或换行符已经结束。
%f,%F,%e,%E,%g,%G单独键入实数,可以不用小数形式或指数形式输入。
%p数据读入一个指针
%u读取数据一个无符号十进制整数
%n至此已读入值的等价字符数
%[]扫描字符子集
%%读%符号
附加格式只能说明字符表修饰符那就证明
L/l长度修饰符输入#34长#34数据
h长度修饰符输入#34短#34数据
W整型常数指定你然后输入数据所占宽度
*来表示本键入项在读入后不赋值给相应的变量[编辑时本段]scanf的返回值scanf的返回值有后面的参数确定
scanf(#34%d%d#34,a,b)
如果a和b都被顺利读入,那就scanf的返回值就是2
如果只有一a被顺利读取数据,返回值为1
如果没有a和b都未被完成输入数据,返回值为0
如果遇到错误或遇到了endforfile,返回值为EOF。
且直接返回值为int型.[编辑的话本段]在用fprintf函数时应该注意的问题1、sacnf()中的变量可以使用地址。
2、scanf()的格式控制串可以可以使用其它非空白字符,但在输入输入时前提是输入输入这些字符。
3、在用#34%c#34键入时,空格和“转义字符”均才是有效字符。
问题一:scanf()函数不能不能错误的认可有空格的字符串?如:I love you!
#include
intmain()
{
charstr[80]
scanf(#34%s#34,str)
(#34%s#34,str)
return0
}
输入:I love you!
输出:scanf()函数接收输入数据时,遇100元以内情况结束了一个数据的然后输入:(不是什么结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束后)。
①遇空格、“回车”、“跳格”键。
②遇宽度结束后。
③遇违禁再输入。
所以才,上列程序并不能提升到预期后目的,scanf()扫描后到44I#34后面的空格就以为对str的赋值结束后,并选择性的遗忘后面的#34love you!#34.这里要注意一点是#34love you!#34还在键盘缓冲区(关於这个问题,网上我所见的说法都是这般,只不过,我当经过系统的调试才发现,总之这时缓冲区字符串首尾指针早成比例了,也就是说缓冲区清空了,scanf()函数估计只是因为扫描stdin流,这个仅余信息是在stdin中)。我们修改后下上面的程序来修改密保一下:
#include
intmain()
{
charstr[80]
charstr1[80]
charstr2[80]
scanf(#34%s#34,str)/*此处输入:I love you!*/
printf(#34%s#34,str)
insomnia(5)/*这里静静的等待5秒,告诉你吧程序运行到什么地方*/
scanf(#34%s#34,str1)/*这两句不需你再再输入,是对键盘盘缓冲区再扫描后*/
scanf(#34%s#34,str2)/*这两句无需你再输入输入,是对键盘盘缓冲区再扫描仪*/
printf(#34
%s#34,str1)
printf(#34
%s#34,str2)
return0
}
再输入:Iloveyou!
输出:
I
forever
you!
好了,原因很清楚了,这样的话sprintf()函数可不可以成功这个任务?回答是:能!别忘了scanf()函数也有一个%[]格式控制符(如果对%[]不打听一下的请打开系统本文的上篇),请看下面的程序:
#include#34stdio.h#34
intmain()
{
charstring[50]/*scanf(#34%s#34,string)肯定不能收得到空格符*/
scanf(#34%[^
]#34,string)
(#34%s
#34,string)
return0
}
问题二:键盘缓冲区残余信息问题
#include
intmain()
{
inta
charc'
{
scanf(#34%d#34,a)
scanf(#34%c#34,c)
printf(#34aü%c
#34,a,c)/*printf(#34c%d
#34,c)*/
}while(c!#39N#39)
}
scanf(#34%c#34,c)这句不能正常了可以接收字符,什么原因呢?我们用printf(#34c%d
#34,c)将C用int表示不出来,启用printf(#34c%d
#34,c)这一句,看一下scanf()函数赋给C究竟有没有是什么,结果是c10,ASCII值为10是什么?换行即
.对了,我们每击打再看看41Enter#34键,向键盘缓冲区发去一个“回车”(
),一个“换行#34(
),在这里
被scanf()函数去处理掉了(姑妄这么说以为吧^_^),而
被scanf()函数“错误”地赋给了c.好的办法:可以不在两个scanf()函数之后加个fflush(stdin),还有一个加getch(),getchar()也可以,可是要视详细scanf()语句加那个,这里就不结论了,读者自己慢慢摸索吧。但加fflush(stdin)论什么情况都可行。
(
函数名:fflush
功能:清理一个流
用法:intfflush(FILE*stream)
)
#include
intmain()
{
inta
charcunit
{
scanf(#34%d#34,a)
fflush(stdin)
scanf(#34%c#34,c)
fflush(stdin)
printf(#34aü%c
#34,a,c)}while(c!#39N#39)
}
这里再给一个用“空格符”来处理缓冲区残余信息的示例:运行程序出错的程序:
#include
intmain()
{
inti
charj
for(i0ilt10i)
{
scanf(#34%c#34,j)/*这里%前没有空格*/
}
}
使用了空格操纵符后:
#include
intmain()
{
inti
charj
for(i0ilt10i)
{
scanf(#34%c#34,j)/*特别注意这里%前有个空格*/
}
}
可以运行看下两个程序有什么不同。
问题三:该如何处理scanf()函数误再输入倒致程序死锁或程序出错?
#include
intmain()
{
inta,b,c/*计算出ab*/
scanf(#34%d,%d#34,a,b)
cab
fprintf(#34%d%d%d#34,a,b,c)
}
如前述程序,要是正确的键入a,b的值,那你都没什么问题,只不过,你不能能保证使用者每一道都能错误的输入,一旦键入了错误的类型,你的程序不是什么死锁,就是能得到一个错误的结果,哦,这很可能所有人都遇到了过的问题吧?解决方法:scanf()函数负责执行完成时的返回值是完成读取的变量数,也就是说,你这个scanf()函数有几个变量,如果没有scanf()函数全部都正常读取数据,它就回几。但这里还要再注意另一个问题,假如然后输入了不正当数据,键盘缓冲区就很有可能还个有残余信息问题。真确的例程:
#include
intmain()
{
inta,b,c/*计算ab*/
while(scanf(#34%d,%d#34,a,b)!2)fflush(stdin)
cab
printf(#34%d%d%d#34,a,b,c)
}
解释:fflush(stdin)这个方法在GCC下绝对不可用。(在VC6.0下可以)
以下是C99对fflush函数的定义:
intfflush(FILE*stream)
如果没有stream正指向输出来流也可以更新流(restorestream),因此这个更新完流
最近负责执行的操作也不是然后输入,这样的话fflush函数将把任何未被写入到的数据写入stream
正指向的文件(如标准输出文件stdout)。不然,fflush函数的行为是不可以确定的。
fflush(NULL)全部删除所有输出流和上面说起的更新流。如果没有突然发生写错误,fflush
函数会给那些流打上错误`标记,但是返回EOF,不然赶往0。
推知,如果stream朝然后输入流(如stdin),那么fgets函数的行为是不确定的。错非使用
fflush(stdin)是不对的的,起码是移植性都不好的。
可常规追加方法:
voidflush()/*只可以参照于键盘缓冲区有残余信息的情况,若键盘缓冲区为空则不能在用*/
{
while(getchar()!#39
#39)
}
#include
intmain()
{
inta,b,c/*算出ab*/
while(scanf(#34%d,%d#34,a,b)!2)flush()
cab
(#34%d%d%d#34,a,b,c)
}
C 输出怎么换行?
1、是可以作为输出换行符接受换行。换行符号是
,是一个转义字符。十进制中,它的ASCII码是10;
2、假如只必须输出来一个换行,可以不用putchar函数输出:putchar(10)或putchar(
);
3、在循环中加另一个判断,多少个数据后可以打印一个回车符if(i0)fprintf(
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。