sscanf

本文详细介绍了sscanf函数的各种使用场景,包括基本用法、指定长度的字符串读取、指定字符集的字符串处理等,并通过实例展示了如何高效地解析字符串。

在处理一些具体字符串的时候能用到sscanf

#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
int main()
{
    char str[100];
    char *s;
    char s1[100];
    char s2[100];
    char s3[100];
    char s4[100];
    int num1;
    int num2;

    //对sscanf()的理解
    int x=sscanf("123456","%4s",str);
    printf("str=%s\n",str);
    cout<<"x="<<x<<endl;
    cout<<endl;
    /*
    输出结果:
    str=1234
    x=1
    控制的位数
    因为str没有确定的值所以在"给定的值"
    */


    //一:简单的用法
    cout<<"1"<<endl;
    s="anhui beijing 123";
    int a=sscanf(s,"%s%s%d",s1,s2,&num1);
    printf("s=%s\n",s);
    printf("a=%d, s1=%s, s2=%s, num1=%d\n",a,s1,s2,num1);
    cout<<endl;
    /*
    s=anhui beijing 123
    a=3, s1=anhui, s2=beijing,s3=123
    从a=3可知sscanf()的返回值是参数的个数
    可以分别给s1,s2,num1赋值是因为有空格的原因
    */


    cout<<"2"<<endl;
    //二:取指定长度的字符串
    s="1234567890";
    sscanf(s,"%4s",s1);
    cout<<"s="<<s<<endl;
    printf("s1=%s\n",s1);
    cout<<endl;
    /*
    s=1234567890
    s1=1234
    这个和控制位数的输出差不多
    可以理解为把s前4个值赋值给s1
    */



    cout<<3<<endl;
    //取到指定的为止的字符串
    s="123/456";
    sscanf(s,"%[^/]",s1);
    cout<<"s="<<s<<endl;
    printf("s1=%s\n",s1);
    cout<<endl;
    /*
    s1=123
    */


    cout<<4<<endl;
    //取到指定字符集为止的字符串
    s="123acbABC";
    sscanf(s,"%[^A-Z]",s1);
    cout<<s<<endl;
    printf("s1=%s\n",s1);
    cout<<endl;
    /*
    s1=123abc
    就是碰到A-Z的其中任意字符都要停止把s的值赋值给s1,
    */


    cout<<5<<endl;
    //取包含指定字符集的字符串
    s="0123abcABC";
    sscanf(s,"%[0-9]%[a-z]%[A-Z]",s1,s2,s3);
    cout<<s<<endl;
    printf("s1=%s, s1=%s, s2=%s\n",s1,s2,s3);
    cout<<endl;
    /*
    s1=0123, s2=abc, s3=ABC
    如果s=01a23abcABC的话s1=01, s2=a ,s3就是一个乱的结果
    */


    cout<<"6"<<endl;
    //获取指定字符中间的字符串
    s="ios<android>wp10";
    sscanf(s,"%[^<]",s1);
    cout<<s<<endl;
    cout<<"s1="<<s1<<endl;
    /*
    s1=ios
    */
    sscanf(s,"%*[^<]<%[^>]",s2);
    cout<<"s2="<<s2<<endl;
    /*
    s2=android
    */

    s="12345acc";
    sscanf(s,"%*da%s",s3);
    cout<<"s3="<<s3<<endl;
    cout<<endl;
    /*
    s3=cc
    如果%*d%s就是acc了
    %*s和%*d加了星号(*)表示跳过此数据不读入
    也就是不把此数据读入参数中
    */



    cout<<7<<endl;
    //指定要跳出的字符串
    s="iosVSandroid";
    sscanf(s,"%[a-z]VS%[a-z]",s1,s2);
    cout<<s<<endl;
    cout<<"s1="<<s1<<endl;
    cout<<"s2="<<s2<<endl;
    cout<<endl;
    /*
    s1=ios
    s2=android
    中间不叫VS也是正确的

    */


    cout<<8<<endl;
    //分割以某字符隔开的字符串
    s="android-iphone-wp10";
    sscanf(s,"%[^-]-%[^-]-%[^-]",s1,s2,s3);
    cout<<"s1="<<s1<<endl;
    cout<<"s2="<<s2<<endl;
    cout<<"s3="<<s3<<endl;
    cout<<endl;
    /*
    和7有点像
    s1=android
    s2=iphone
    s3=wp10
    */


    cout<<9<<endl;
    //提取邮箱地址
    s="Email:beijing@sina.com.cn";
    sscanf(s,"%[^:]:%[^@]@%[^.].%s",s1,s2,s3,s4);
    printf("s1=%s, s2=%s, s3=%s, s4=%s\n",s1,s2,s3,s4);
    cout<<endl;
    /*
    s1=Email
    s2=beijing
    s3=sina
    s4=com.cn
    */

    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值