免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2722 | 回复: 6
打印 上一主题 下一主题

strstr()如何嵌套使用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-10 17:33 |只看该作者 |倒序浏览
#include<string.h>;
#include<stdio.h>;
int main()
{
char * s="01234567890123456789012345678901";
char *p,*p1;
p= strstr(s,"901";

printf("%s\n",p);
p1=strstr(p,"901";
printf("%s\n",p1);

return 0;
}

我想使p1指向“9012345678901”,
可还是指向“90123456789012345678901”,why?

论坛徽章:
0
2 [报告]
发表于 2005-10-10 17:50 |只看该作者

strstr()如何嵌套使用?

在90123456789012345678901中找901当然返回的还是自己了。

论坛徽章:
0
3 [报告]
发表于 2005-10-10 17:52 |只看该作者

strstr()如何嵌套使用?

第一次执行strstr,返回的指针p指向字符"9"
第二次执行时,p是以"901"打头的字符串,当然返回的和以前的一样了。
你只要重新调整p所指向的字符,哪怕就++p,令指针后移一个字符就可以了。


  1. #include<string.h>;
  2. #include<stdio.h>;
  3. int main()
  4. {
  5.         char * s="01234567890123456789012345678901";
  6.         char* subStr = "901";
  7.         char *p,*p1;
  8.         p= strstr(s,subStr);

  9.         printf("%s\n",p);
  10.         p += strlen(subStr);
  11.         p1=strstr(p,subStr);
  12.         printf("%s\n",p1);

  13.         return 0;
  14. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2005-10-10 18:06 |只看该作者

strstr()如何嵌套使用?

同意楼上,需要移动一个sep的size

论坛徽章:
0
5 [报告]
发表于 2005-10-10 19:17 |只看该作者

strstr()如何嵌套使用?

就是如此

论坛徽章:
0
6 [报告]
发表于 2005-10-10 19:29 |只看该作者

strstr()如何嵌套使用?

哎呀,疏忽了

论坛徽章:
0
7 [报告]
发表于 2005-10-11 00:22 |只看该作者

strstr()如何嵌套使用?

换一个regex的方法:
#include <stdio.h>;
#include <errno.h>;
#include <sys/types.h>;
#include <regex.h>;

/*
* position  to string
*/

int RSTART;         /* start offset to string */
int RLENGTH;        /* substring length */

/*
* match匹配成功 , 返回 1
*      不能匹配 , 返回 0
*/
int match(char *string, char *pattern )
{

    int     status;
    int     errnum;
    regex_t re;

    status = errnum = 0;
    bzero( &re , sizeof( regex_t ));

    /*
     * REG_EXTENDED 支持扩展的正则表达式
     */
    if (( errnum = regcomp( &re, pattern, REG_EXTENDED )) != 0)
        return(0) ;/* report error */

#ifdef DEBUG
    fprintf(stderr, "re.re_nsub  %d\n",re.re_nsub );
#endif

    {
        size_t  nmatch = 1;
        regmatch_t pmatch;

        char *substring = string;
        char *matchstr  = NULL;
        static int initial;

       do
        {
            switch( status = regexec( &re, substring,
                            (size_t) nmatch, &pmatch, REG_NOTBOL ))
            {
                case 0:
                    initial = 1;
                    RSTART  = substring - string + pmatch.rm_so ;
                    RLENGTH = pmatch.rm_eo - pmatch.rm_so;

                    matchstr = ( char * )calloc ( RLENGTH, sizeof( char ));
                    memcpy( matchstr , string + RSTART , RLENGTH );
                    fprintf( stdout, "\tmatchstr:%s,\t\tRSTART:%d,\tRLENGTH:%d ;\n",
                                      matchstr, RSTART, RLENGTH );
                    free( matchstr );
                    matchstr = NULL;
                    substring += pmatch.rm_eo;
                    break;
                case REG_NOMATCH:
                    if( initial == 0 )
                        fprintf( stderr, "not match !\n" );
                    else
                    {
                        fprintf( stderr, "\nmatch complete .\n" );
                        return 1;
                    }
                break;

                default:
                    fprintf( stderr,
                            "error, return value of regexec is: %d !.\n",status );
            }
        }
        while( status == 0 );

    }

    regfree(&re);
    if (status != 0)
        return(0) ;              /* report error */

   return(1);
}
int main()
{
    int retval = 0;
    char *str="01234567890123456789012345678901";

    fprintf( stdout, "str is [%s]\n", str );

    retval = match( str, "901";

    if( retval == 1 )
        fprintf( stdout, "match ok!\n" );
    else if( retval == 0 )
        fprintf( stdout, "match fail!\n" );

    return 0;
}

结果:
str is [01234567890123456789012345678901]
        matchstr:901,           RSTART:9,       RLENGTH:3 ;
        matchstr:901,           RSTART:19,      RLENGTH:3 ;
        matchstr:901,           RSTART:29,      RLENGTH:3 ;

match complete .
match ok!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP