将只含有大小写和空格的字符串S拆分,用C++ string实现?
怪我咯
怪我咯 2017-04-17 13:39:42
0
3
608

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

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

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(3)
大家讲道理

我有點記不清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不支援operator[],這段程式碼怎麼可能通過編譯?

  • 第二,居然連string支援[ ]這種常識都無法確定,真的用過C++ string嗎…

刘奇

可以使用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++;
        }


問題中的程式碼應該是記憶體的問題,具體還不太懂。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板