请教下sscanf能否解析出类似这种的多个字符串?

brk1985 2018-10-22 10:27:37
CString szNetworkP = "0|192.168.1.101|192.168.1.1|255.255.255.0|192.168.1.1|554|80";
CString strDhcpFlag;
CString strIp;
CString strGateway;
CString strMask;
CString strDNS;
CString strRtspPort;
CString strOnvifPort;
//sscanf(szNetworkP, "%s|%s|%s|%s|%s|%s|%s", strDhcpFlag, strIp, strGateway, strMask, strDNS, strRtspPort, strOnvifPort);
sscanf(szNetworkP, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]", strDhcpFlag, strIp, strGateway, strMask, strDNS, strRtspPort, strOnvifPort);
//sscanf(szNetworkP, "%[1-9]|%[1-9,.]|%[1-9,.]|%[1-9,.]|%[1-9,.]|%[1-9]|%[1-9]", strDhcpFlag, strIp, strGateway, strMask, strDNS, strRtspPort, strOnvifPort);

试了上述好多种方式,发现都不行。如果用sscanf,不知道有办法吗?
...全文
266 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-10-23
  • 打赏
  • 举报
回复
再供参考:
#include <stdio.h>
#include <string.h>
#include <time.h>
struct tm st;
time_t tt;
char timstr[40];
char tmpbuf[128];
char c;
int t;
int AP() {
    if ('P'==c || 'p'==c) {st.tm_hour+=12;return 1;}
    if ('A'==c || 'a'==c)                 return 1;
                                          return 0;
}
int dtparse() {
    if (7==sscanf(timstr,"%d/%d/%4d %d:%d:%d %c",&st.tm_mday,&st.tm_mon ,&st.tm_year,&st.tm_hour,&st.tm_min,&st.tm_sec,&c)) if (AP()) goto STEP2;
    if (6==sscanf(timstr,"%d/%d/%4d %d:%d%c"    ,&st.tm_mday,&st.tm_mon ,&st.tm_year,&st.tm_hour,&st.tm_min           ,&c)) if (AP()) goto STEP1;
    if (6==sscanf(timstr,"%4d/%d/%d %d:%d %c"   ,&st.tm_year,&st.tm_mon ,&st.tm_mday,&st.tm_hour,&st.tm_min           ,&c)) if (AP()) goto STEP1;
    if (5==sscanf(timstr,"%d.%d.%4d %d:%d"      ,&st.tm_mon ,&st.tm_mday,&st.tm_year,&st.tm_hour,&st.tm_min              ))           goto STEP1;
    if (6==sscanf(timstr,"%4d-%d-%d %d:%d:%d"   ,&st.tm_year,&st.tm_mon ,&st.tm_mday,&st.tm_hour,&st.tm_min,&st.tm_sec   ))           goto STEP2;
STEP1:
    st.tm_sec=0;
STEP2:
    st.tm_year-=1900;
    if (st.tm_mon>12) {t=st.tm_mon;st.tm_mon=st.tm_mday;st.tm_mday=t;}
    st.tm_mon-=1;
    tt=mktime(&st);
    if (-1!=tt) {
        strftime(tmpbuf,128,"%Y-%m-%d %H:%M:%S",localtime(&tt));
        return 1;
    } else {
        printf("[%s] is Invalid time string!\n",timstr);
        return 0;
    }
}
int main() {
    strcpy(timstr,"10.01.2012 15:43"        );if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);
    strcpy(timstr,"8/11/2006 11:10AM"       );if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);
    strcpy(timstr,"2006/10/31 04:50 PM"     );if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);
    strcpy(timstr,"1/6/2010 5:20:12 PM"     );if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);
    strcpy(timstr,"13/12/2012 11:16:17 a.m.");if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);
    strcpy(timstr,"2013-06-08 09:56:59"     );if (dtparse()) printf("[%s] is [%s]\n",timstr,tmpbuf);
    return 0;
}
//[10.01.2012 15:43] is [2012-10-01 15:43:00]
//[8/11/2006 11:10AM] is [2006-11-08 11:10:00]
//[2006/10/31 04:50 PM] is [2006-10-31 16:50:00]
//[1/6/2010 5:20:12 PM] is [2010-06-01 17:20:12]
//[13/12/2012 11:16:17 a.m.] is [2012-12-13 11:16:17]
//[2013-06-08 09:56:59] is [2013-06-08 09:56:59]
//
赵4老师 2018-10-23
  • 打赏
  • 举报
回复
请判断sscanf函数的返回值。 仅供参考:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
brk1985 2018-10-22
  • 打赏
  • 举报
回复
引用 2 楼 NexTor 的回复:
strDhcpFlag, strIp, strGateway, strMask, strDNS, strRtspPort, strOnvifPort变量别定义为CString,用char数组应该就可以
    string 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.c_str(), "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]", &strDhcpFlag, &strIp, &strGateway, &strMask, &strDNS, &strRtspPort, &strOnvifPort);


试了下可以,看来是CString的问题。

这里是字符串,不需要加取地址符号&吧。但是加上&结果也正常。

sscanf(szNetworkP, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]", strDhcpFlag, strIp, strGateway, strMask, strDNS, strRtspPort, strOnvifPort);
@风轻云淡_ 2018-10-22
  • 打赏
  • 举报
回复
再一个,这种scanf,sscanf,printf之类的函数,不要使用封装好的string,cstring字符串类型,要使用数组。
@风轻云淡_ 2018-10-22
  • 打赏
  • 举报
回复
sscanf(szNetworkP, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%s", strDhcpFlag, strIp, strGateway, strMask, strDNS, strRtspPort, strOnvifPort);
brk1985 2018-10-22
  • 打赏
  • 举报
回复
引用 1 楼 hjwang77 的回复:
sscanf(szNetworkP, "%s%[^|]|%s ....
第二种方法修正一下应该就行了,你s%都没了怎么收数据?


取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456

%[^|]是取到|为止的字符串,把0赋值给strDhcpFlag,这里我没有处理错
NexTor 2018-10-22
  • 打赏
  • 举报
回复
strDhcpFlag, strIp, strGateway, strMask, strDNS, strRtspPort, strOnvifPort变量别定义为CString,用char数组应该就可以
    string 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.c_str(), "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]", &strDhcpFlag, &strIp, &strGateway, &strMask, &strDNS, &strRtspPort, &strOnvifPort);
英雄@末路 2018-10-22
  • 打赏
  • 举报
回复
sscanf(szNetworkP, "%s%[^|]|%s ....
第二种方法修正一下应该就行了,你s%都没了怎么收数据?

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧