scanf处理

/*
函数原型:int scanf(const char * restrict format,...);
解释:c语言的格式化输入函数与printf类似,头文件定义在<stdio.h>中,它是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中.
      函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应.
返回值:int型,返回正确读入的数据项。如果遇到错误或文件结尾返回EOF,end of file为Ctrl+z 或者Ctrl+d。
格式指令说明:
1.*表示读入的数据被舍弃,带有*的格式指令不对应可变参数列表中的任何数据,读入但不保存。
2.域宽:以一个非零的十进制整数形式出现,表示该格式指令最多读入的字符数。
3.格式说明符:c表示读入指定宽度的字符(%2c更高的宽度测试不成功)  s(字符串) d(可带正负号的10进制整数) i(可选符号的整数) o(可选符号的8进制整数)  x X(可选符号的16进制整数)  p(指针) n(不读入任何字符)
注意点:
1.控制串中的空白字符(空格,制表符,table键)可以使scanf在输入流中跳过一个或者多个空白行,知道发现非空白字符为止,这些空白字符读入但不保存。
  如:scanf("%3d\n\n%5d",&a,&b)在输入中可以换行两行再输入第二个数字。
2.非空白符使 sca流中读一个匹配的字符并忽略。例如,"%d,%d" 使 scanf 先读入一个整数,读入中放弃逗号,然后读另一个整数。可以直接在终端输入如:12,34.
3.在输入流中,数据项必须由空格、制表符和新行符分割。逗号和分号等不是分隔符:
  如:scanf("%d%d",&a,&b) 输入为:12 34 而不是12,34或者是12;34
  但是对scanf("%c%c%c",&a,&b,&c)d单个字符输入时它们(空格、制表符和新行符分割)作为普通字符,会被读入进去的。
  如:输入:xyz 正确 输入x y z  则a=x;b= (空格);c=y;
4.控制串中的其它字符,包括空格、制表符和新行符,都用于从输入流中匹配并放弃字符,被匹配的字符都放弃。
  如:scanf("%dt%d",&x,&y);输入:12t34 ,则x=12;y=34;t被丢弃。
5.设置给定域宽,如果输入大于设定,则只读取设定长度,下次scanf接着读取。  
6.scanf特性:扫描集。读入允许的字符并赋给相应的字符数组,前边加%。%[A-Z]区分大小写,^表示补集,可匹配其它所有字符。
  如:scanf("%[ABC]",str) 你输入ABCabc 只会打印出来ABC而不是ABCabc.它是连续扫描匹配字符,知道发现不在集合内的字符为止,如果你输入AaBbCc,只会打印A!
  对于输入含有空格的字符串处理可以这样:scanf("%[^\n]",str),否则只会显示第一个空格前的字符,想要看到其它信息需要接着打印。其它的缓冲在标准输入流中,而不是键盘缓冲区内。
7. %d格式控制输入时,可以使用回车,TAB,空格作为分隔符。分隔符可以同时使用,不限个数,最后一个enter\n会被读入。
   %s %c格式输入的时候,空格 table 转义字符会被读入。
   如:scanf("%10s",ss);scanf("%c%c",&m,&n);
   输入123456789012 ss=1234567890 m=1 n=2.
   输入1234567890 按回车键 \n被读入 再输入12(两个字符)此时ss=1234567890 m=\n n=1.最后一个字符被忽略。

   可以scanf("%10s\n",ss);或者getchar()匹配\n字符解决这个问题或者就是连着输入。

8.scanf()每次回车之后从缓冲区读取数据,当缓冲区为非空时才结束输入。

  如:scanf(“%c\n”,&c);输入一个字符按回车键后数据被读入\n也被读入,缓冲区为0所以还要再输入一下才可以结束。


*/

测试代码:

#include<stdio.h>
#include<string.h>

int main()
{
int a;
int b;
int c;
char m;
char n;
char ss[20]={0};
  int v=0;
  /*
  if((c=scanf("%3d,%5d",&a,&b))!=2)//输入错误刷新缓冲区防止死锁或者得到一个错误的结果
{
fflush(stdin);//getchar()
printf("刷新缓冲区成功,请重启输入\n");
}*/
  
c=scanf("%3d%*c%5d",&a,&b);//连着写如%d%d在输入的时候要用空格或者table键分割,分开写则加,隔开。如果输入的字符宽度大于设定运行数值会出错。
fflush(stdin);
scanf("%10s",ss);//如果输入大于10如qwertyuioplk(12个)则下次scanf接着这次停止开始意味着m n的值为l和k。
fflush(stdin);
v=strlen(ss);
scanf("%c%c",&m,&n);//%c%c之间没有空格那么在输入的时候两个字符之间也不能有空格要连续输入。
//scanf("%c\n",&m);
//scanf("%c",&n);
fflush(stdin);
printf("v=%d\n",v);
printf("a=%6d\n",a);

printf("b=%6d\n",b);

printf("ss=%15s\n",ss);

printf("m=%5c\n",m);
printf("n=%5c\n",n);
printf("c=%2d\n",c);

return 0;

}

测试结果:

——————————————————————————

[root@libmaster zxd]# ./a.out 
12 34
qwertyuiop
qw
v=10
a=    12
b=    34
ss=     qwertyuiop
m=    


n=    q
c= 2

——————————————————————————

/*
对于\n的处理:
#include<stdio.h>
#include<string.h>
int main()
{
/*int i=0;
char str[10]={0};
scanf("%[ABC]",str);
printf("%s\n",str);*///匹配字符测试
char a,b;
scanf("%c",&a);
scanf("%c",&b);
printf("%c\n",a);
printf("%c\n",b);
return 0;

}

测试结果:这个含有\n问题

————————————————————————

[root@libmaster zxd]# ./a.out 
r
r



————————————————————————

修改为:

#include<stdio.h>
#include<string.h>
int main()
{
/*int i=0;
char str[10]={0};
scanf("%[ABC]",str);
printf("%s\n",str);*/
char a,b;
scanf("%c\n",&a);
//getchar();
scanf("%c",&b);//这个地方(最后一个输入的)不用加 加\n的话最后需要多输入一个字符(任意的)
printf("%c\n",a);
printf("%c\n",b);
return 0;
}

测试结果:匹配\n法去掉\n问题

——————————————————

[root@libmaster zxd]# ./a.out 
v
c
v
c

——————————————————

修改为:

#include<stdio.h>
#include<string.h>
int main()
{
/*int i=0;
char str[10]={0};
scanf("%[ABC]",str);
printf("%s\n",str);*/
char a,b;
scanf("%c",&a);
getchar();
scanf("%c",&b);
printf("%c\n",a);
printf("%c\n",b);
return 0;
}

测试结果:getchar()把enter的时候\n读入从而去掉\n

——————————————————

[root@libmaster zxd]# ./a.out 
w
r
w
r

——————————————————



猜你喜欢

转载自blog.csdn.net/linuxzhuxiaodi/article/details/77865664
今日推荐