Linux-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

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

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux中的scanf是一个函数,用于从标准输入流中读取格式输入。它可以读取各种数据类型,如整数、浮点数、字符等,并将它们存储在变量中。scanf函数是C语言中的标准库函数,也可以在C++中使用。 ### 回答2: scanf是C语言中的一个标准库函数,它能够从标准输入设备(通常是键盘)读取格式化的输入,并将其赋值给变量。Linux作为一种类Unix操作系统,同样支持scanf函数scanf函数能够读取各种格式输入,如整数、浮点数、字符、字符串等。它的使用非常灵活,可以根据需求自由组合格式化字符串,以达到预期的输入格式Linuxscanf函数的使用方法与C语言中一致,只需要在程序中包含stdio.h头文件,并使用相应的参数即可。scanf函数返回值为成功读取的参数数目,通常用于判断输入是否完整。 由于Linux作为一个开源操作系统,其庞大的用户和开发者社区不断完善和优化系统,因此请注意Linux中的scanf函数可能会存在一定的差异或变化,需要根据具体的Linux发行版和版本进行相应的调整。 总之,Linux中的scanf函数是C语言的标准库函数,能够帮助程序读取格式输入,非常方便和灵活。在实际开发中需要注意适当的参数调整和错误处理,以保证程序功能的正确性和稳定性。 ### 回答3: scanfLinux系统下的C语言标准库函数,用于从标准输入流(stdin)中读取数据。它以格式输入的方式读取数据,可以读取不同类型的数据到程序的内存中。 scanf函数的基本用法是:scanf("格式控制串", 变量1, 变量2, ...); 其中格式控制串用于匹配输入格式,变量1, 变量2, ...用于存储从标准输入流中读取的数据。 例如,如果想要从标准输入流中读取一个整数,可以使用如下代码: int num; scanf("%d", &num); 这里,格式控制串是"%d",它表示输入的数据类型是整数,"&num"是要存储的变量的地址。 除了读取整数外,scanf还可以读取其他类型的数据,如字符、字符串、浮点数、布尔值等。不同的数据类型需要使用不同的格式控制串,例如读取一个字符可以使用"%c",读取一个字符串可以使用"%s"等。 需要注意的是,scanf函数存在一些风险,如缓冲区溢出、类型不一致等,因此在使用时需要特别小心,避免安全漏洞的产生。同时,建议使用更安全的函数,如fgets等,进行输入操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值