sscanf 、scanf函数与空白处理

    开始使用sscanf与scanf函数时,其对空白的处理让我郁闷了很久,今天抽空研究了颇有收获,随笔记下,望对网友们有所帮助
   
int sscanf(char *string, char *format, arg1, arg2, ...)与int scanf(char *format, ...)是用于从字符串(或输入流)中依据指定的格式提取目标数据的函数,其提取规则大体如下:

    1.提取数值类型数据(format中%d之类所对应数据):
    
使用了一个%d说明符来读取一个整数,scanf()函数开始每次读取一个输入字符,它跳过空白字符(空格,制表符和换行符)直到遇到一个非空白字符。因为它试 图读取一个整数,所以scanf()期望发现一个数字字符或者一个符号(+或者-)。如果它发现了一个数字或一个符号,那么它就保存之并读取下一个字符; 如果接下来的字符是一个数字,它保存这个数字,并读取下一个字符。就这样,scanf()持续读取和保存字符直到它遇到一个非数字的字符。
   
如果遇到了一个非数字的字符,它就得出结论,已读到了整数的尾部,scanf()把这个非数字字符放回输入,这就意味这当程序下一次开始读取输入时,它将从前面被放弃的那个非数字字符开始。最后,scanf()计算它所读取到的相应数值,并将该值放到指定的变量中。
    如果第一个非空白字符不是数字,将会发生什么呢?比如说,是A而非一个数字?这是scanf()会停在那里,并把A(或者不管是什么)放回输入,没有把任何 值赋值给指定变量,程序下一次读取输入时,它就从A处重新开始。如果程序中只有%d说明符,scanf()永远也不会超过那个A(去读下一个)。

    2.提取字符类型数据(format中%c所对应数据):
   
如果使用%c说明符,那么所有的输入字符都是平等的,如果下一个输入字符是一个空格或者换行符,将会把这个空格或者换行符赋值给指定的变量。

    3.提取字符串类型数据(format含%s所对应数据):
   
如果使用%s说明符,那么空白符以外的所有字符都是可以接受的,所以scanf()跳过所有空白符直到遇到第一个非空白符,然后保存再次遇到空白符之前的所有非空白字符。这就意味着%s使scanf()读取一个单词,也就是说,一个不包括空白字符的字符串。当scanf()把字符串放到一个数组中时,它将添 加终止的'/0'使得数组成为一个C字符串。

附加:
   
1.A whitespace character in the format string causes scanf( ) to skip over zero or more whitespace characters in the input stream. A whitespace character is either a space, a tab character, or a newline. In essence, one whitespace character in the control string will cause scanf( ) to read, but not store, any number (including zero) of whitespace characters up to the first nonwhitespace character

    2.Literal characters can apper in the scanf format string, They must match the same characters in the input 

更详细说明请参考:sscanf 与scanf

你可能感兴趣的:(C/C++)