您的位置:首页 > 编程语言 > C语言/C++

C语言 scanf函数的机理和常规的格式字符串

2015-11-15 21:04 274 查看

scanf函数的机理和常规的格式字符串

一.scanf函数的机理



我们更仔细地研究 scanf()怎样读取输入。

假定使用了一个%d说明符来读取一个整数,scanf()函数开始每次读取一个输入字符,它跳过空白字符(空格、制表符和换行符)直到遇到一个非空白字符。因为它试图读取一个整数,所以scanf()期望发现一个数字字符或者一个符号(+或者-)。如果它发现了一个数字或一个符号,那么它就保存之并读取下一个字符;如果接下来的字符是一个数字,它保存这个数字,并读取下一个字符。就这样,scanf()持续读取和保存字符直到它遇到一个非数字的字符。如果遇到了一个非数字的字符,它就得出结论:己读到了整数的尾部。scanf()把这个非数字字符放回输入。这就意味着当程序下一次开始读取输入时,它将从前面被放弃的那个非数字字符开始。最后,
scanf()计算它读取到的数字的相应数值,并将该值放到指定的变量中。

如果您使用了字段宽度,那么scanf()在字段结尾或者在第一个空白字符处(二者中最先到达的一个)终止。

如果第一个非空白字符不是数字,将会发生什么呢?比如说,是A而非一个数字?这时 scanf()会停在那里,并把A(或者不管是什么)放回输入。没把任何值赋给指定的变量,程序下一次读取输入时,它就在A处重新开始。如果程序中只有%d说明符 ,scanf()永远也不会越过那个 A (去读下一个)。而且,如果使用带有多个说明符的scanf()语旬. ANSIC 要求函数在第一个出错的地方停止读取输入 。

使用其他数字说明符读取输入与使用%d的情况相同。主要的区别在于scanf()也许会把更多的字符看作数字的一部分。例如,%x说明符要求scanf()识别十六进制数字a到f和A到F。浮点说明符要求scanf()识别小数点、指数记数法 ( e-notation )、新的p记数法( p-notation)。

如果使用%s说明符,那么空白字符以外的所有字符都是可接受的,所以scanf()跳过空白字符直到遇到第一个非空白字符,然后保存再次遇到空白字符之前的所有非空白字符。这就意味着使scanf()读取一个单词,也就是说,一个不包含空白字符的字符串。如果使用字段宽度, scanf()在字段的结尾或者第一个空白字符处停止。不能通过字段宽度使得scanf()用一个%s说明符读取多于一个字的输入。最后一点: 当scanf()把字符串放在一个指定的数组中时,它添加终止的’\0’使得数组内容成为一个C字符串。

如果使用 %c说明符,那么所有的输入字符都是平等的。如果下一个输入字符是一个空格或者换行符,将会把这个空格或换行符赋给指定的变量:不会跳过空白字符。

二、格式字符串中的常规字符

1.如果无意间把,放在两个说明符之间



scanf()函数将其解释成,您将键入一个数字,键入一个逗号,然后再键入一个数字。也就是说,您必须像下面这样输入两个整数

8,66

因为在格式字符串中逗号紧跟在%d后面,所以您必须紧跟8输入一个逗号。不过,因为scanf()会跳过整数前面的空白字符,所以在输入时可以在逗号后面键入一个空格或换行符。也就是说,下面的两种输入方式也可以接受:

8,66

或者

8,

66

2.格式字符串中的空格意味着跳过下个输入项之前的任何空格。例如下面的语句:



将会接受下列任何一个输入行:







这就是scanf牵涉出来了,一些细节性的内容,大家可以稍微注意一下,嘿嘿


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: