一个关于list容器中存储char *类型元素的问题 ??

wangkangsoldier 2009-03-11 11:39:08
#include <iostream>
#include <list>
#include <vector>
#include <string>
using namespace std;

int main()
{
list<char*> lst;
string str;
cout<<"Please enter strings:";
while (cin>>str && str != "q")
{
char* p = (char *)str.c_str();
lst.push_back(p); //我用调试器调试这个地方有问题。
}
list<char*>::iterator iter = lst.begin();
while (iter != lst.end())
{
cout << *iter <<endl;
++iter;
}
return 0;
}
输入的结果是: 用q把输入的字符串代替了(即有多少个输入字符串就有多少个q)
我用vc调试器调试了 但是不知道为什么 并且怎么去解决
请大家帮忙 谢谢!
...全文
618 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dpkirin 2009-03-19
  • 打赏
  • 举报
回复
学习学习
jssz103b 2009-03-16
  • 打赏
  • 举报
回复
上面的代码有两处问题
char* p=new char[strlen(str.c_str())];
应该是char* p=new char[strlen(str.c_str())+1];

list <char*>::iterator it = lst.begin();
while (it != lst.end())
{
delete [] (*it);
++it;
}
list.clear();
topwork 2009-03-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wangkangsoldier 的回复:]
题目要求用list <char *> 写程序 
不知道怎么修改才对
[/Quote]

那你每次都要给p分配空间,然后把字符串复制过去。
北极猩猩 2009-03-12
  • 打赏
  • 举报
回复
嘿嘿,又来晚了。
记住string.c_str()返回的是string的内部指针,并没有额外分配内存。

c_str()返回的应该是const char *很明显是不能直接复制给char *的。而你通过强制转换来达成目的。
记得这个教训吧,用强制转换之前确定你知道自己在做什么
chin_chen 2009-03-12
  • 打赏
  • 举报
回复
改好了,拿去用吧

#include <iostream>
#include <list>
#include <vector>
#include <string>
#include <cstring>
using namespace std;

int main()
{
list <char*> lst;
string str;
cout <<"Please enter strings:";
while (cin>>str && str != "q")
{
char* p=new char[strlen(str.c_str())];
strcpy(p,(char *)str.c_str());
lst.push_back(p); //我用调试器调试这个地方有问题。
}
list <char*>::iterator iter = lst.begin();
while (iter != lst.end())
{
cout << *iter <<endl;

++iter;
}
while (iter != lst.end())
{
delete [] (*iter);

++iter;
}

system("pause");
return 0;
}
wangkangsoldier 2009-03-12
  • 打赏
  • 举报
回复
题目要求用list<char *> 写程序
不知道怎么修改才对
wangkangsoldier 2009-03-12
  • 打赏
  • 举报
回复
谢谢大家 我想想看
yangch_nhcmo 2009-03-12
  • 打赏
  • 举报
回复

#include <iostream>
#include <list>
#include <vector>
#include <string>
using namespace std;

int main()
{
list <string> lst; //直接使用string类型
string str;
cout << "Please enter strings:";
while (cin>>str && str != "q")
{
// char* p = (char *)str.c_str();
lst.push_back(str); //直接传入str
}
list <string>::iterator iter = lst.begin();
while (iter != lst.end())
{
cout << *iter << endl;
++iter;
}
return 0;
}

chin_chen 2009-03-12
  • 打赏
  • 举报
回复
又慢了一步,郁闷。
chin_chen 2009-03-12
  • 打赏
  • 举报
回复
while (cin>>str && str != "q")
{
char* p = (char *)str.c_str();
lst.push_back(p); //我用调试器调试这个地方有问题。
}

你最后是不是输入了q?那个char *)str.c_str();只有一个,你怎么lst.push_back(p);其实就在这一直这样添加同样一个指针的值。
一旦输入q后,程序退出了,str就是q,然后你输出的时候就在输入此时推出时str的值,就是q。
懂了没
wangkangsoldier 2009-03-12
  • 打赏
  • 举报
回复
非常感谢大家 学到了 谢谢
beyond071 2009-03-12
  • 打赏
  • 举报
回复
认真学习了
  • 打赏
  • 举报
回复
你把指针存入list做什么?
char* p最好new一下。
sys0008 2009-03-11
  • 打赏
  • 举报
回复
因为你的list<char*>里面存储的是指针。
char* p = (char *)str.c_str();
lst.push_back(p);
相当于把str的内存指针存入list中。
而你的while循环里每次都是将str的同一个指针放入list
str最后一个复制是q,也就是说你list中的元素都指向了q.也就是你看到的结果。

#include <iostream>
#include <list>
#include <vector>
#include <string>
using namespace std;

int main()
{
list <string> lst;
string str;
cout <<"Please enter strings:";
while (cin>>str && str != "q")
{
lst.push_back(str);
}
list <string>::iterator iter = lst.begin();
while (iter != lst.end())
{
cout << *iter <<endl;
++iter;
}
return 0;
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧