搜尋

首頁  >  問答  >  主體

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

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

怪我咯怪我咯2804 天前594

全部回覆(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
  • 取消回覆