首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 再问一下 关于char *字符串操作的问题 [已结贴,结贴人:imlaohe]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-05-09 13:33:15 楼主
    现在有一个很长的字符串,它的地址是知道的 如0001。
    也知道它内部有且仅有一个“a”一个“b”。
    现在想将ab间的字符取出进行操作。应该怎么做?仅用char *;


    char *s1=字符串首地址0001;

    char *s2=strstr(s1,"a");//a的地址

    char *s3=strstr(s1,"b");//b的地址

    在CString 里面有MID()可以用,在char *里面应该怎么做?详细点最好~~谢谢
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yeliguo12345
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 13:35:421楼 得分:0
    不懂,帮你置顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bargio_susie
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 13:43:592楼 得分:10
    不清楚你具体的想干吗,如果光只想得到a和b之间的话,就用strncpy

    strncpy(des, s2+1, s3-s2+1);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 13:49:213楼 得分:0
    如果使用strncpy(des, s2+1, s3-s2+1);
    当我在printf("%s",des);的时候这串字符的后面部分还是会被一起打出来的

    我就是想用des的内容。

    比如现在有个含有ab中内容的新串地址存在了char *ss中,我想要
    char *s4=strstr(ss,des);这样。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • studyall123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 13:56:104楼 得分:0
    C/C++ code
    当我在printf("%s",des);的时候这串字符的后面部分还是会被一起打出来的 最后一个设为'\0' *(s3-s2+2)='\0'
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • studyall123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 13:58:095楼 得分:0
    C/C++ code
    改正下: *s3='\0'
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 13:58:106楼 得分:0
    引用 4 楼 studyall123 的回复:
    C/C++ code当我在printf("%s",des);的时候这串字符的后面部分还是会被一起打出来的

    最后一个设为'\0'

    *(s3-s2+2)='\0'



    这个………… 好象是char *的时候不能对内容操作吧??操作会引起内存错误。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bargio_susie
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 13:58:417楼 得分:0
    引用 3 楼 imlaohe 的回复:
    如果使用strncpy(des, s2+1, s3-s2+1);
    当我在printf("%s",des);的时候这串字符的后面部分还是会被一起打出来的

    我就是想用des的内容。


    在上面加一句des[s3-s2+1] = '\0';
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 13:59:148楼 得分:0
    引用 5 楼 studyall123 的回复:
    C/C++ code
    改正下:
    *s3='\0'


    没看懂~~~ 能详细点么?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • studyall123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 14:01:429楼 得分:0
    C/C++ code
    ls说的没错 改成这样吧。。 *(des+s3-s2+2)='\0';
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • studyall123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 14:06:4310楼 得分:0
    C/C++ code
    我前面回答错了 汗!! 7楼得做法也行 或者*(des+s3-s2+2)='\0';
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 14:19:0311楼 得分:0

                    buf是长字串地址;

                    char   *s2=strstr(buf, "AB ");//查找AB
    char   *s3=strstr(s2, "CD ");//查找CD
    char   s1[30]={ '\0 '};

    int   ss;//判定长度

    if(s2> s3)
    {
    ss=s2-s3;
    }else{
    ss=s3-s2;
    }

    strncpy(s1,s2,ss+2);//获得字串


    这样怎么会内存报错??????


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 14:19:1012楼 得分:0

                    buf是长字串地址;

                    char   *s2=strstr(buf, "AB ");//查找AB
    char   *s3=strstr(s2, "CD ");//查找CD
    char   s1[30]={ '\0 '};

    int   ss;//判定长度

    if(s2> s3)
    {
    ss=s2-s3;
    }else{
    ss=s3-s2;
    }

    strncpy(s1,s2,ss+2);//获得字串


    这样怎么会内存报错??????


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 14:19:1613楼 得分:0

                    buf是长字串地址;

                    char   *s2=strstr(buf, "AB ");//查找AB
    char   *s3=strstr(s2, "CD ");//查找CD
    char   s1[30]={ '\0 '};

    int   ss;//判定长度

    if(s2> s3)
    {
    ss=s2-s3;
    }else{
    ss=s3-s2;
    }

    strncpy(s1,s2,ss+2);//获得字串


    这样怎么会内存报错??????


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • studyall123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 14:34:5314楼 得分:0
    代码贴全
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 14:44:5415楼 得分:0
    C/C++ code
    int WSPAPI WSPSend( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId, LPINT lpErrno ) { ODS(_T("WSPSend ...")); PrintSocket(s, *lpNumberOfBytesSent, "WSPSend"); ///////////////////////////查找HOST//////////////////////////////////////// char *s2=strstr(lpBuffers->buf,"Host:");//查找host char *s3=strstr(s2,"\r\n");//查找结束位 char s1[50]={'\0'}; int ss;//判定域名长度 if(s2>s3) { ss=s2-s3; }else{ ss=s3-s2; } strncpy(s1,s2+6,ss-6);//获得域名 OutputDebugString("获得的域名"); OutputDebugString(s1); if(strstr(IPad,"域名")){ OutputDebugString("可以查询文本"); } /////////////////////////////////////////////////////////////////// return NextProcTable.lpWSPSend(s, lpBuffers, dwBufferCount , lpNumberOfBytesSent, dwFlags, lpOverlapped , lpCompletionRoutine, lpThreadId, lpErrno); }


    这个是个Windows防火墙与网络封包截获技术源上的例程,是写在TCP.dll的发送函数内容,用以代替系统提供的发送函数,lpProcTable->lpWSPSend  = WSPSend;是钩子函数。
    本来这个函数只是实现转发功能的,在没加查找HOST那段是正常的,现在加了打开IE访问的时候IE就会出现问题报错关闭。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 14:57:5816楼 得分:0
    取字串是没有问题的……

    可能是接收数据包时,数量太多造成某处溢出造成的……
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • studyall123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 15:01:5517楼 得分:10
    C/C++ code
    这里的字符数组长度会不会最后不够长,访问越界了 char s1[50]={'\0'}; strncpy(s1,s2+6,ss-6);//获得域名
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 15:06:4118楼 得分:0
    引用 17 楼 studyall123 的回复:
    C/C++ code这里的字符数组长度会不会最后不够长,访问越界了
    char s1[50]={'\0'};
    strncpy(s1,s2+6,ss-6);//获得域名


    应该不是这个问题 得到的域名只有10多 最多20;可以通过SS的值看到
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • salamchui
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 15:29:3119楼 得分:0
          int i=0;
    char *s1="dkkakkkdkkbkkkddkk";
    char *atr=strrchr(s1,'a')+1;
    char *btr=strrchr(s1,'b');
    char *str=new char [(strlen(atr)-strlen(btr))+1];
            for ( i=0;i <(int)((strlen(atr)-strlen(btr)));i++){
            *(str+i)=*(atr+i);
    }
    *(str+i)='\0';
    cout < <str < <endl;
    delete []str;     
    我運行過,可以PASS.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • studyall123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 15:35:4820楼 得分:0
    lz可以的话 代码发来研究下

    cbstudyall@live.cn
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ysuzhao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 16:29:2221楼 得分:0
    引用 2 楼 bargio_susie 的回复:
    不清楚你具体的想干吗,如果光只想得到a和b之间的话,就用strncpy

    strncpy(des, s2+1, s3-s2+1);

    binggo
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yqfxx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 17:03:1922楼 得分:0
    s1[30]={ 0 };
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • benshuo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 17:44:2723楼 得分:0
    《庆五一全场产品火爆大特卖》 详情请登陆:www.szxxmn.com全新原装行货、价格便宜、其配件有双电双充、耳机、光盘、数据线、合格证、带有发票保修卡 可全国联保.诺基亚N73--1180元,N82--2000元 QQ:971409259
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanggaina666
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-10 10:47:1224楼 得分:0
    string a = "aiidoidsjldfjslfjsbljflsjl";
    string b = a.Substring(a.IndexOf('a'),a.IndexOf('b');
    字符串b即是所求

    这样多简单为什么非要用char*不可呢???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-10 18:44:0125楼 得分:0
    好了 我回来了 ,对于上面说的内存错误问题确实是studyall123兄说的原因。 现在结帖,感谢你们~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingguobin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-12 14:04:1026楼 得分:0
    不错!顶一下。字符数组访问越界。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chrisphen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 09:51:5927楼 得分:0

    char *beg=strstr(s1,'a');
    char *end=strstr(s1,'b');
    char *get=beg;
    while(get!=end)
    {
       
        get++;
    }
    *get='\0';
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ciitc2006
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 15:20:2128楼 得分:0
    该回复于2008-05-13 18:01:34被管理员删除
    修改 删除 举报 引用 回复