首页
社区
课程
招聘
如何扫描字符串中是否包含想要的字符串组合?
发表于: 2013-5-16 14:45 6371

如何扫描字符串中是否包含想要的字符串组合?

2013-5-16 14:45
6371
原字长串可能是这样的:
"xxxxxxxxx 8880D yyyyyy"

我主要是想扫描出字符串中是否包含一个【数字+D】这样的组合
xxx、yyy为任意长度字符串
8880为长度不定数字,为简单起见,假设范围在int型以内

如:
"xxxxx 11D yyyyyy" 结果应该为符合要求
"xxxxxxx 8880 D yyyyyy"结果应该为不符合要求,因8800与D不是连接着的
"xxxxxxxx 55BD yyyyyy"结果应该为不符合要求,因55与D不是紧连接着的
"xxxxxxxxx D yyyyyy"结果应该为不符合要求,因D前无数字

尽量用最简单的c/c++算法 :)
麻烦大家了

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个是正则表达式?
2013-5-16 14:57
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
正则表达式太复杂了,想求简单的点的办法
本来是想用sscanf搞的
2013-5-16 15:26
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
char *s="xxxxxxx 8880D yyyyyy";
char buff[2][100]={0};

if ( ( 2 ^ sscanf(s,"%*[^ ] %[0-9]%[D]", buff[0],buff[1] ) )){
printf("match error.\n");
return 0;
}

printf("%s-%s\n" , buff[0],buff[1] );


为什么说我回复的消息太短了????
2013-5-16 17:45
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
你的代码如果字符串改成这样就不行了:
“xx  xx  xxx 8880D”
你试试,麻烦再帮改改
先谢谢了:)
2013-5-16 18:01
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
BOOL CheckString(PCHAR lpTarChar)
{
        static char MathChar[11]="0123456789";
        ULONG len=strlen(lpTarChar);
        if (!len)
                return FALSE;

        //当前字符的前部是否为连续数字
        BOOL IsNum=FALSE;
        for (ULONG i=0;i<len;i++)
        {
                //当前是不是数字
                BOOL bNum=FALSE;
                for (ULONG n=0;n<10;n++)
                {
                        if(lpTarChar[i]==MathChar[n])
                        {
                                bNum=TRUE;
                                break;
                        }
                }
               
                if (!bNum)
                {
                        //当前字符是D且前面是连续的数字
                        if (lpTarChar[i]=='D' && IsNum )
                        {
                                return TRUE;
                        }
                }
                //不是连续数字状态,重置标志位continue
                IsNum=bNum;
        }
        return FALSE;
}
楼主,可以闭眼睛写出来,这纯粹是来逗乐的
2013-5-16 18:35
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个只需要遍历字符串,看数字之后的一个字符是否是'D',这是一种,也可以看'D'前一个字符是否是数字即可。
2013-5-16 19:03
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主好像没有要求'D'之前一定要是连续的数字吧。比如"xxx 3939 398484Dxxx"也是成立的吧。是不是。
2013-5-16 19:07
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
xxx、yyy为任意长度字符串
8880为长度不定数字,为简单起见,假设范围在int型以内
2013-5-16 19:14
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
xxx 3423809423xxx3D xxx
xxx 3423809423 3D xxx
xxx 34238094233D xxx
xxx 3423809423xxx3D xxx
都可以得出正确的结果,是我的注释有误导,谢谢提醒
2013-5-16 19:30
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主你的问题sscanf 无法胜任吧?也许是我能力有限,,帮不了你啦...
还是老老实实自己写处理算法吧
2013-5-17 00:05
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
我能力有限,这是根据4楼的方式写出来的,但多次使用了sscanf:

                                                         int len = strlen(deviceName);

                                                         char buff[2][100]={0};
                                                         for (char* pstr = Name; pstr < Name + len - 1; pstr++)
                                                         {
                                                                 int num = 0;

                                                                 pD |= (sscanf(pstr, "%[0-9]%[D]", buff[0], buff[1]) == 2);        //test
                                                                 
                                                         }
2013-5-20 10:06
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=淡定疯着;1178024]BOOL CheckString(PCHAR lpTarChar)
{
        static char MathChar[11]="0123456789";
        ULONG len=strlen(lpTarChar);
        if (!len)
                return FALSE;

        //当前字符的前部是否为连续数...[/QUOTE]

我之所以来问,真不是逗乐
我是想看看sscanf能不能有高级的用法,一句搞定的,4楼的哥们给了一个比较好的用法,只不过还差一点

你的方法是使用的最土的方式,当然是能完成
2013-5-20 14:37
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
不错的习惯,代码写的越薄越好维护和升级,能少一行是一行
2013-5-20 18:28
0
游客
登录 | 注册 方可回帖
返回
//