对于一个只含有大小写和空格的字符串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++;
}
问题中的代码应该是内存的问题,具体还不太懂。