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

浏览:47日期:2023-05-09

问题描述

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

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

问题解答

回答1:

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

回答2:

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

回答3:

可以使用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,' '); elsebreak; i++;}

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

相关文章: