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

将只含有大小写和空格的字符串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++;
        }

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


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


忍不住想笑,你真是问对地方了,我没亲自实验,不过我猜这段程序在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的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++;
        }


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

【热门文章】
【热门文章】