对于一个只含有大小写和空格的字符串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++;
}
基础不扎实,希望大神多多指点。
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嗎…
怪我咯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++;
}
問題中的程式碼應該是記憶體的問題,具體還不太懂。