首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

存储C风格字符串的list从标准输入取值时出现的有关问题

2012-03-02 
存储C风格字符串的list从标准输入取值时出现的问题#includestdafx.h #include iostream#include vect

存储C风格字符串的list从标准输入取值时出现的问题
#include   "stdafx.h "
#include <iostream>
#include <vector>
#include <list>
#include <string>
using   namespace   std;
   
int   main()
{
list <const   char*>   lis;
cout < < "enter   some   string   to   list(list <const   char*> ):   " < <endl;
string   s;
while(cin> > s)                                
lis.push_back(s.c_str());
cin.clear();
cout < < "the   list   is:   " < <endl;
for(list <const   char*> ::iterator   iter=lis.begin();iter!=lis.end();++iter)
cout < <*iter < < "   ";
cout < <endl;
vector <string>   svec;
svec.assign(lis.begin(),lis.end());
cout < < "the   vector <string>   is:   " < <endl;
for(vector <string> ::iterator   iter=svec.begin();iter!=svec.end();++iter)
cout < <*iter < < "   ";
cout < <endl;
cin.get();
return   0;
}

问题是:
例如我输入:thank   you   for   helping   me回车
输出的结果确实:
(两个容器中都是)me   me   me   me   me(个数和输入的单词数量一致)

[解决办法]
因为只有s一个string 变量阿。
当你 lis.push_back(s.c_str()); 的时候,只是把s里面字符缓冲区的地址放到了list里面。
而当下一个输入来了之后,s前面的值被覆盖了,可是s的字符缓冲区地址不会因此而改变。
所以,你多次push_back进去的都是同一个地址。
所以。。。你得到的实际就是多个相同的地址。
只有最后一次输入的字符串有效,其他都被覆盖了。
建议还是把list <const char*> lis; 改成--〉list <string> lis;
这样,每次push_back的时候,都构造出一个新的string对象.放在list里面。

热点排行