首页 新闻 论坛 群组 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被管理员删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • phoenix3
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 15:57:2629楼 得分:0
    char *s1=字符串首地址0001;

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

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

    int nsize = 0;
    if(s2==NULL||s3==NULL)
    return;

    nsize = (s3-s2)+1;


    char *pData = new char [nsize];

    memcpy(pData,s2+1,nsize-1);
    pData[nsize]=0;
    //使用完了
    delete []pdata;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lirui0326
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 16:06:5230楼 得分:0
    开发;卓越呼叫中心、三农热线”语音农业综合信息服务平台、卓越办公自动化软件、卓越电厂MIS系统、卓越客户关系管理系统、卓越网站制作、卓越医疗信息管理系统;沈阳卓越科技有限公司;www.excellence-tech.com
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lily604
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 19:06:3331楼 得分:0
    #incldue <iostream>
    using namespace std;

    void main()
    {
        char *ch="vcaiuoiwebd";
        char *sh;
        ch=0001;
        int i=0;
        while(i <strlen(ch)&&ch[i]!=a)
        {
              i++;
        }
        for(int k=0;j=i;j <strlen(ch)&&ch[j]!=b;j++,k++)
          sh[k]=ch[j];
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lily604
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 19:17:2432楼 得分:0
    这个能运行
    #include <iostream>
    using namespace std;

    void main()
    {
        char *ch="vcaiuoiwebd";
        char sh[10];
        int length=0;
        int i=0;
        while(i <strlen(ch)&&ch[i]!='a')
        {
              i++;
        }
        for(int k=0,j=i+1;j <strlen(ch)&&ch[j]!='b';j++,k++)
    {
    sh[k]=ch[j];
    length=k;
    }
    for(int l=0;l <=length;l++)
    cout < <sh[l];
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • junhecup
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-13 21:33:3533楼 得分:0
    楼上正解
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fyplinux
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-14 01:15:3334楼 得分:0
    strtok on a,

    将产生两个token,

    如果第一个token含b,
            对这个token, strtok on b, 产生子token, 第二个子token就是
    如果第二个token含b,
            对这个token, strtok on b, 产生子token, 第一个子token就是
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tncqsy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-14 09:07:4035楼 得分:0
    引用 24 楼 wanggaina666 的回复:
    string a = "aiidoidsjldfjslfjsbljflsjl";
    string b = a.Substring(a.IndexOf('a'),a.IndexOf('b');
    字符串b即是所求

    这样多简单为什么非要用char*不可呢???

    我也觉得这个才是C++的做法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • imlaohe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-15 13:16:1836楼 得分:0
    引用 24 楼 wanggaina666 的回复:
    string a = "aiidoidsjldfjslfjsbljflsjl";
    string b = a.Substring(a.IndexOf('a'),a.IndexOf('b');
    字符串b即是所求

    这样多简单为什么非要用char*不可呢???


    其实这个我也有试过,不过没有找到是什么原因,运行以后会程序报错,自动关闭。

    获得的字符串是char *型的,而且很长,没有"\0"符。

    对于楼上各位的代码,当然完全可以运行,但都是对自己赋值的char *型,对于这种没有"\0"符号的长字串处理起来就不太方便了。很容易造成溢出。

    最后我采用的方法是对存放字串的数组初始化全部赋值"\0",这样就可以了。
    修改 删除 举报 引用 回复