读书人

存储C风格字符串的list从标准输入取值

发布时间: 2012-03-02 14:40:28 作者: rapoo

存储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里面。

读书人网 >C++

热点推荐