ホームページ  >  に質問  >  本文

将只含有大小写和空格的字符串S拆分,用C++ string实现?

对于一个只含有大小写和空格的字符串S,按空格将其拆分为若干字符串,存放在字符串数组t中。比如“Hello World”,将其拆分为“Hello”和“World”。
我用C++实现,却总是在t[num].assign(s,i-j,j);这一句报错。请问这是为什么?应该怎么实现?
以下是这段代码。

        string s; 
        int n;//s的长度
        string *t=new string;
        string s1;
        int num=0;
        int i=0;
        while(i<n){
            cout<<"i="<<i<<endl;
            int j=0;//dancichangdu
            while(s.at(i)!=32){
                i++;
                j++;
                if(i>=n)
                    break;
            }
            t[num].assign(s,i-j,j);//报错的地方。运行到此处显示.exe"已停止工作"。
            num++;//geshu
            i++;
        }

基础不扎实,希望大神多多指点。

怪我咯怪我咯2714日前554

全員に返信(3)返信します

  • 大家讲道理

    大家讲道理2017-04-17 13:41:42

    我有点记不清了string支持 operate[]么? 你声明的string并不是个数组

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 13:41:42

    忍不住想笑,你真是问对地方了,我没亲自实验,不过我猜这段程序在Linux上运行的结果肯定是segment fault

    仔细看看你这句话:

    t[num].assign(s, i-j, j);

    t是什么?t的类型是指向string的指针。指针类型是C语言里就存在的东西,C++要向下兼容,因此语义是一样的。而在C语言里,t[num]就是*(t + num)的语法糖,完全等价,所以写成num[t]结果也是一模一样的,只不过很少有人这么用。

    前面你一共就用new申请了一个单位的内存,就是t指向的那个位置。现在你去访问t之后num个位置的地方,当然访问越界了。操作系统为了安全起见,立即结束了你的程序。

    关于指针,如果你是初学C++,建议绕行。指针是C++从C语言中继承而来的,对C语言来说不可或缺,但C++中一般不建议使用,因为容易造成各种安全漏洞。以你这段程序为例,除了访问越界以外,你还忘了用delete释放你分配的内存。

    另,@GAO 为啥被采纳为答案了,顺便批判一下。

    • 第一,要是string不支持operator[],这段代码怎么可能通过编译?

    • 第二,居然连string支持[ ]这种常识都无法确定,真的用过C++ string吗…

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 13:41:42

    可以使用string的insert(n:int,string:s)接口(将字符串s插在位置n+1,如果为空串则插在0处)。

            string s1;
            int num=0;
            int i=0;    
            while(1){
                int j=0;//dancichangdu
                while(s.at(i)!=32){
                    i++;
                    j++;
                    if(i>=n)
                        break;
                }
                string r;
                r.assign(s,i-j,j);//将一个单词放在r中
                s1.insert(0,r);//要善用stl的接口
                num++;//单词个数
                if(i<n)
                    s1.insert(0," ");
                else
                    break;
                i++;
            }
    
    
    

    问题中的代码应该是内存的问题,具体还不太懂。

    返事
    0
  • キャンセル返事