scanf 使用总结

c标准库提供的格式化输出函数:

int scanf(const char *format, ...);

其它family 函数:
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);


scanf最令人兴奋的地方就在于 format。这里使用实际代码总结下比较少用的2个格式化功能:   %[ ]  和 %n


1.从标准输入中读取带有空格的字符串

       当然 我们可以使用char *fgets(char *s, int size, FILE *stream);

       但是scanf同样可以完成,我们知道scanf的默认以空白符(空格、制表符、回车)分割字符,所以当你输入"hello world"之类的字符串时,得到的只是 hello而已。

       你可以使用 %[ ] 来完成,    %[ ]可以让我们自定义一个搜索字符集,^ 表示取反的意思     %[^\n]表示不是'\n'都读入,遇到'\n'就停止,也可以在%之后加入数字表示最多读入多少个字符,这样可以控制数组溢出。

      

#include <stdio.h>
#define MAX_SIZE 128
int
main(void)
{
     char buf[MAX_SIZE+1];
     scanf("%MAX_SIZE[^\n]",buf);
     printf("%s\n",buf);
     return 0;
}

2.使用自定义的字符分割

        scanf的默认以空白符(空格、制表符、回车)分割字符,那么可不可以自己定义分割的字符呢?   可以,同样使用%[ ]

        比如,这样一个字符串"email:christian_chen@126.com" ,我要从这个字符串中提取出user:christian_chen 出来

       一起来看代码       

#include <stdio.h>
#define MAX_SIZE 128
int
main(void)
{
    char email_addr[] = "email:christian_chen@126.com";
    char user[MAX_SIZE];
    sscanf(email_addr,"%*[^:]:%[^@]",user);
    printf("%s\n",user);
}

%*[^:]表示读取不是':'的字符,*表示只读取不存储,也就是忽略了字符串‘:’之前的内容,:%[^@]匹配了一个':'忽略 ,然后读取了不是'@'的字符,也就读取了我们需要的christian_chen

其实stdin.h 提供的scanf非常实用,这里总结一些小技巧

   之后总结.....

   



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值