scanf的用法

 1、 scanf()函数是格式化输入函数,它从标准输入设备(键盘)缓存中读取输入的信息。

  其调用格式为: scanf("<格式化字符串>",<地址表>),如下所示:

  
  
  
  
  1. int a; 
  2. scanf("%d",&a); 

  以上代码会将键盘的输入转换成int类型,并赋值给a。

  所有转换指定符的含义如下:

转换字符
含义
d
将输入转换成int
i
将输入转换成int。如果加了前缀0,就输入八进制数。0x或OX,则输入十六进制数
o
将输入转换成int,并假定所有的数字都是八进制数
u
将输入转换成unsigned int
x
将输入转换成int,并假定所有的数字都是十六进制数
c
将下一个字符读入为char类型(包含空白)。如果在读入单个字符时要忽略空白,就在格式指定符的前面加上一个空白字符。
s
从下一个非空白字符开始,输入一串连续的非空白字符
e、f、g
将输入转换成float类型,输入中的小数点和指数是可选的。
n
不读入任何输入,但前面读到此处为止的数字字符存储在对应的int*类型参数中

  下表中,是转换指定符的应用实例:  

指定符
说明
%lf
将下一个值读取为double类型
%*d
读入下一个整数值,但不存储它
%lc
将一下字符读取为wchar_t类型
%\nc
将下一个字符读取为char类型,并忽略空白字符
%10lld

将接下来的10个字符读取为long long类型的整数值

%5d
将接下来的5个字符读取为一个整数
%Lf

将下一个值读取为long double类型的浮点数

%hu

将下一个值读取为unsigned short类型

M
指定输入数据所占宽度
*
空读一个字符,有了这个符号,只会读取,但不存储
H
输入“短”数据
L
输入“长”数据

  2、空白字符

   在scanf函数在从键盘读取的时候,会自动忽略一个或多个空白字符。

  3、非空白字符()

   一个非空白字符会使scanf函数在读取的时候,剔除掉与这个非空白字符相同的字符。

   地址表是需要读入的所有变量的地址,而不是变量本身,这个与printf()函数不同,需要特别注意!

  
  
  
  
  1. #include <stdio.h> 
  2. int main() 
  3.    int i,j; 
  4.    printf("i = %d,j = %d\n",i,j); 
  5.    scanf("%d,%d",&i,&j); 
  6.    return 0; 

   说明:scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型数。如果","这一特定字符没有找到,scanf()函数就终止。若参数之间的分隔符为空格,则参数之间必须输入一个或多个空格。  

   4、地址问题

   对于字符串数组或者是字符串指针变量,由于数组名和指针变量名本身就是地址,因此在使用scanf函数的时候,不需要加&操作符。

  
  
  
  
  1. #include <stdio.h> 
  2.  
  3. int main() 
  4.   char *p = NULL; 
  5.   char str1[20],str2[20]; 
  6.   p = str2; 
  7.  
  8.   scanf("%s",str1); 
  9.   printf("str1 = %s ",str1); 
  10.   printf("str2 = %s\n",p); 
  11.    
  12.   return 0; 

  输入:123 \n 345  输出结果: str1 = 123 str2 = 345。输出正确

  5、输入控制

   可以在格式化字符串中的"%"各转换指定符之间加入一个整数,表示任意数读取中的最大位数。

    如上例中,若规定只能输入2个字符给字符串数组str1,则需要在第一条更改为:  

  
  
  
  
  1. #include <stdio.h> 
  2.  
  3. int main() 
  4.   char *p = NULL; 
  5.   char str1[20],str2[20]; 
  6.   p = str2; 
  7.  
  8.   scanf("%2s",str1); 
  9.   scanf("%s",p); 
  10.  
  11.   printf("str1 = %s\n",str1); 
  12.   printf("str2 = %s\n",p); 
  13.   return  0; 

   程序运行时一旦输入字符个数大于2,str1就不再继续读入,而后面的一个读入函数即scanf("%s", p)就会从第3个字符开始读入。 

   所以当输入一次输入的字符大于2的时候,剩下的部分会由字符串指针p接收,事实上,就这等于执行第二个scanf语句。所以,如果第一次输入的字符个数大于2,那么按回车之后,程序就会打印了。

  6、多个数值数据

    在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对"%d"输入"12A"时,A即为非法数据)时即认为该数据结束,看下面的例子:

  
  
  
  
  1. #include <stdio.h> 
  2.  
  3. int main() 
  4.   int a; 
  5.   scanf("%d",&a); 
  6.   printf("after a  = %d\n",a); 
  7.   return  0; 

    输入:12A  输出: after a = 12 

  7、字符串数据(%c)问题

   在使用scanf函数的时候,如果格式化字符串指定为"%c",则会将所有输入的字符均认为是有效的字符,看下面程序:

  
  
  
  
  1. #include <stdio.h> 
  2. int main() 
  3.   char a,b,c; 
  4.   scanf("%c%c%c",&a,&b,&c); 
  5.   printf("a = %c,b = %c,c = %c\n",a,b,c); 
  6.   return 0; 

   输入:a(空格)b(空格)c   输出: a = a b = (空格) c = b

   输出并未按照我们的想法输出。

   由于没有指定分割符,所以,在读取输入的时候,scanf将空格也作为一个有效字符进行读取,并赋值给第二个变量。故b的值就是一个空格而已。

    如果加了分割符,如下:

  
  
  
  
  1. #include <stdio.h> 
  2.  
  3. int main() 
  4.   char a,b,c; 
  5.   scanf("%c %c %c",&a,&b,&c); 
  6.   printf("a = %c,b = %c,c = %c\n",a,b,c); 
  7.   return 0;

    输入:a(空格)b(空格)c   输出: a = a b = b c = c

 

 

 

 

本文出自 “Linux的生活” 博客,谢绝转载!

你可能感兴趣的:(职场,休闲,C语言scanf)