C++ sscanf()用法总结

    xiaoxiao2021-12-02  54

        1. 常见用法

    [cpp] view plain copy  print?

    sscanf("123456 ""%s", str);  

     

        2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

    [cpp] view plain copy  print?

    sscanf("123456 ""%4s", str);  

     

        3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

    [cpp] view plain copy  print?

    sscanf("123456 abcdedf""%[^ ]", str);  

     

        4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。 

    [cpp] view plain copy  print?

    sscanf("123456abcdedfBCDEF""%[1-9a-z]", str);  

     

        5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

    [cpp] view plain copy  print?

    sscanf("123456abcdedfBCDEF""%[^A-Z]", str);  

     

        6. 用它来分隔类似这样的字符串2006:03:18:

    [cpp] view plain copy  print?

    int a, b, c;  sscanf("2006:03:18""%d:%d:%d", &a, &b, &c);  

    以及2006:03:18 - 2006:04:18:

     

    [cpp] view plain copy  print?

    char sztime1[16] = "", sztime2[16] = "";  sscanf("2006:03:18 - 2006:04:18""%s - %s", sztime1, sztime2);  

     

        7. 原问题:iios/12DDWDFF@122 获取/和@之间的字符串怎么做

     

    [cpp] view plain copy  print?

    #include <stdio.h>  int main()  {      const char* s = "<span style="word-wrap: normal; word-break: normal;">iios/12DDWDFF@122</span>";      char buf[20];      sscanf( s, "%*[^/]/%[^@]", buf );      printf( "%s\n", buf );      return 0;  }  

     

    结果为:12DDWDFF     sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入

    源。

    函数原型:     int scanf( const char *format [,argument]... );     其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type  |' '|'\t'|'\n'|非%符

    号}

    注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。

        width:宽度,一般可以忽略

    用法如:

    [cpp] view plain copy  print?

    const  char sourceStr[] = "hello, world";  char buf[10] = {0};  sscanf(sourceStr, "%5s", buf);   //%5s,只取5个字符  cout << buf<< endl;  

    结果为:hello

     

        {h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节size,L表示4字节size(double例

    外),l64表示8字节size。

        type: 这就很多了,就是%s,%d之类。

    特别的:

        %*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:

    [cpp] view plain copy  print?

    const  char sourceStr[] = "hello, world";  char buf[10] = {0};  sscanf(sourceStr, "%*s%s", buf);   //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了  cout << buf<< endl;  

    结果为:world

     

        支持集合操作:          %[a-z]  表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)          %[aB']  匹配a、B、'中一员,贪婪性          %[^a]    匹配非a的任意字符,贪婪性     sscanf可以支持格式字符%[] 这为分析字符串提供了很大方便(其实scanf也支持%[])     先看一下%[] 格式:     (1)-: 表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地 %

    [A-Z]只读取大写字母     (2)^: 表示不取,如:%[^1]表示读取除'1'以外的所有字符 %[^/]表示除/以外的所有字符     (3),: 范围可以用","相连接 如%[1-9,a-z]表示同时取1-9数字和a-z小写字母      (4)原则:从第一个在指定范围内的数字开始读取,到第一个不在范围内的数字结束%s 可以看成%[]

    的一个特例 %[^ ](注意^后面有一个空格!)     这和正则表达式很相似,而且仍然支持过滤,即可以有%*[a-z].如:

    [cpp] view plain copy  print?

    const char* s = "";  char buf[20];  sscanf( s, "%*[^/]/%[^@]", buf );  printf( "%s\n", buf );  

        先将 "iios/"过滤掉,再将非的一串内容送到buf中,cool.得到结果。

     

        例:

    [cpp] view plain copy  print?

    sscanf("wpc:123456""7[^:]:7[^ ]", user_name, password);  

    结果:user_name是wpc,password是123456

     

     

    [cpp] view plain copy  print?

    sscanf( "" , "%*[^/]/%d[^D]", &i );  

    结果:12342

     

     

    [cpp] view plain copy  print?

    string szMsg("0001A");  unsigned long ulValue = 0;  sscanf(szMsg.c_str(), "%4x", &ulValue);  

    结果:1

     

     

    [cpp] view plain copy  print?

    string szMsg("0001A");  unsigned long ulValue = 0;  sscanf(szMsg.c_str(), "%x", &ulValue);  

    结果:26

     

     

    [cpp] view plain copy  print?

    string szMsg  ("_Community=public&_MachineName=192.168.6.96&_Port=161&devicetype=_SnmpWin&seid=2");  char *pPos = strstr(szMsg.c_str(), "devicetype=");  if(pPos)  {      char *chDevID = new char[strlen(pPos)];      if(chDevID)      {          memset(chDevID, 0, strlen(pPos));          cout << pPos << endl;          sscanf(pPos, "devicetype= %[^&]", chDevID);          cout <<  "Device Type is:" << chDevID << endl;          delete []chDevID;      }  }  

     

    结果: devicetype=_SnmpWin&seid=2 Device Type is:_SnmpWin

    sscanf(格式化字符串输入)

     

     

     

    相关函数

    scanf,fscanf

    表头文件

    #include<stdio.h>

    定义函数

    int sscanf (const char *str,const char * format,........);

    函数说明

    sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。

    返回值

    成功则返回参数数目,失败则返回-1,错误原因存于errno中。

    范例

    #include<stdio.h> main() { int i; unsigned int j; char input[ ]=”10 0x1b aaaaaaaa bbbbbbbb”; char s[5]; sscanf(input,”%d %x %5[a-z] %*s %f”,&i,&j,s,s); printf(“%d %d %s\n”,i,j,s); }

    执行

    10 27 aaaaa

     

    CString szNetworkP = "0|192.168.1.101|192.168.1.1|255.255.255.0|192.168.1.1|554|80"; char strDhcpFlag[100]; char strIp[100]; char strGateway[100]; char strMask[100]; char strDNS[100]; char strRtspPort[100]; char strOnvifPort[100]; //sscanf(szNetworkP, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]", &strDhcpFlag, &strIp, &strGateway, &strMask, &strDNS, &strRtspPort, &strOnvifPort); sscanf(szNetworkP, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]", strDhcpFlag, strIp, strGateway, strMask, strDNS, strRtspPort, strOnvifPort); CString sztime1, sztime2; //sscanf("2006:03:18 2006:04:18", "%s %s", sztime1, sztime2); //sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2); CString buf1; sscanf("123456 abcdedf", "%[^ ]", buf1); //printf("%s\n", buf); char buf[]="port=5000"; char key[100]=""; char value[100]=""; //sscanf(buf,"%[^=]=%[^\n]",key,value); sscanf(buf,"%[^=]=%s",key,value);

     

    转载请注明原文地址: https://ju.6miu.com/read-679676.html

    最新回复(0)