Chinaunix

标题: 不能正常使用 strstr !! [打印本页]

作者: lostiger    时间: 2006-09-13 11:32
标题: 不能正常使用 strstr !!
现在有这样一个文件,其内容如下:

>>>>>>>>>>>>>>>One Over[20060907-083448]<<<<<<<<<<<<<<<<<

read ackhead. i=95 == headlen=95=
AckPktHead.len            =124=
AckPktHead.factorycode    ==
AckPktHead.progid         =5=
AckPktHead.morepkt        = =
AckPktHead.cmd_id         =10012=
AckPktHead.start_num      =0=
AckPktHead.end_num        =0=
AckPktHead.request_id     =186=
AckPktHead.answer_id      =0=
AckPktHead.sequence       =0=
AckPktHead.rec_seperator  =;=
AckPktHead.field_seperator=~=
AckPktHead.reserved1      =0=
AckPktHead.reserved2      =0=
AckPktHead.reserved3      ==

>>>>>>>>>>>>>>>One Begin[20060907-083459]<<<<<<<<<<<<<<<<<
read ack body. i=29 == bodylen=29=
AckPktBody.errorcode=0=
AckPktBody.datatrans=13528919566~FS0AAAF0002~0~2=
InStr[00]=13528919566=
InStr[01]=FS0AAAF0002=

现在想用strstr查找它的子串---One Over和One Begin
我分配了一个 char buff[2048];
的空间,读入文件内容

结果发现:
   ptmp1 = strstr(pcurrent, "One Begin"); 为null
    ptmp2 = strstr(pcurrent, "One Over");  则为正确的结果

请问那位知道这是怎么回事?
和什么双字符有关系么?
作者: nnnqpnnn    时间: 2006-09-13 12:20
确认你已经把"One Begin"读进pcurrent了
确认"One Begin" 之前没有字符串结束符
作者: dlms    时间: 2006-09-13 12:39
贴代码,肯定是那不对!
作者: lonelyair    时间: 2006-09-13 12:39
ptmp1 = strstr(pcurrent1, "One Begin"); 为null
ptmp2 = strstr(pcurrent2, "One Over");  则为正确的结果



分配两个 char buff[2048]; 试试

怀疑是不是被覆盖了。
作者: JohnBull    时间: 2006-09-13 13:28
估计又是把字符串分两部分读进来的。
作者: sttty    时间: 2006-09-13 13:40
fprintf(stderr, "%s\n", pcurrent);
先看看有没有你要字符串.
作者: lostiger    时间: 2006-09-13 15:25
谢谢大家
谢谢 nnnqpnnn
我找到原因了,是因为提前出现了字符结束符,就是在这个地方,
“AckPktHead.morepkt        = = ”
那两个等号之间的空居然是一个结束符 靠

to JohnBull
你说的问题,我在程序中设法避免的了 因此没有这个情况
作者: lostiger    时间: 2006-09-13 15:29
中午睡觉,总是想这个
起来调试,找到原因

那么像这种文件里面出现 结束符的
就不能使用strstr了?

是不是需要自己写一个函数,首先确定字符串的长度,而不管有没有结束符了

[ 本帖最后由 lostiger 于 2006-9-13 15:30 编辑 ]
作者: lostiger    时间: 2006-09-13 20:56
大家是怎么处理这种 “提前出现了字符结束符”
的情况的?
作者: sydby    时间: 2006-11-16 19:24
修改strstr函数原型:
原来是这样的:
char * strstr(const char * s1,const char * s2)
{
       int l1, l2;

       l2 = strlen(s2);
       if (!l2)
               return (char *) s1;
       l1 = strlen(s1);
       while (l1 >= l2) {
               l1--;
               if (!memcmp(s1,s2,l2))
                       return (char *) s1;
               s1++;
       }
       return NULL;
}
修改成这样就好了:
char * mystrstr(const char * s1,const char * s2,int l1,int l2)
{

    if (!l2)
        return (char *) s1;
    while (l1 >= l2) {
        l1--;
        if (!memcmp(s1,s2,l2))
            return (char *) s1;
        s1++;
    }
    return NULL;
}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2