万分火急 在线等 map 为什么只有一项

tan625747 2010-03-07 08:54:04


#include <iostream>
#include <sstream>
#include <map>

using namespace std;

map<char*,int >NameMessage;

int main()
{
map <char*,int>::iterator iter;
string str="fsdf|233#fdf|34443#fd|45454";

stringstream ss(str);
string sub_str;
char name[20];
while(getline(ss,sub_str,'#')) //以#为间隔分割test的内容
{
int n=0;
n=sub_str.find_last_of('|');
::strncpy(name,str.c_str(),n);
name[n]='\0';
int m=0;
m+3;

NameMessage[name]=m;//加入map里面
}

for(iter=NameMessage.begin ();iter!=NameMessage.end ();++iter)
{
cout<<iter->first<<iter->second <<endl;
}

}



经调试发现NameMessage 为什么只有一项
...全文
107 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tan625747 2010-03-08
  • 打赏
  • 举报
回复
谢楼上了


::strncpy(name,str.c_str(),n);这句有问题

应该是strncpy(name,sub_str.c_str(),n);
tan625747 2010-03-08
  • 打赏
  • 举报
回复
谢楼上解答


不过答案有问题

fs45454
fsd34443
fsdf233

还是没有达到目的
yuzl32 2010-03-07
  • 打赏
  • 举报
回复

#include <iostream>
#include <sstream>
#include <map>

using namespace std;

map<string,int >NameMessage;

int main()
{
map <string,int>::iterator iter;
string str="fsdf|233#fdf|34443#fd|45454";

stringstream ss(str);
string sub_str;
char name[20];

while(getline(ss,sub_str,'#')) //以#为间隔分割test的内容
{
int n=0;
char *endptr = "\0";

n=sub_str.find_first_of('|');
::strncpy(name,str.c_str(),n);
name[n]='\0';

int m= strtol(sub_str.substr(n+1).c_str(),&endptr,10);

NameMessage[string(name)]=m;//加入map里面
}

for(iter=NameMessage.begin ();iter!=NameMessage.end ();++iter)
{
cout<<iter->first<<iter->second <<endl;
}

}
tan625747 2010-03-07
  • 打赏
  • 举报
回复
引用 5 楼 yuzl32 的回复:
::strncpy(name,sub_str.c_str(),n);
--------
还有这里,应该是获取截断后的字符串吧?



再提取 从 截断后的字符串 用'|'隔开

把数字和字母 分别提取出来
tan625747 2010-03-07
  • 打赏
  • 举报
回复
fsdf|233

fdf|34443

fd|45454

分别放入到map里面



yuzl32 2010-03-07
  • 打赏
  • 举报
回复
::strncpy(name,sub_str.c_str(),n);
--------
还有这里,应该是获取截断后的字符串吧?
yuzl32 2010-03-07
  • 打赏
  • 举报
回复
NameMessage[name]=m;//指向同一个地址
tan625747 2010-03-07
  • 打赏
  • 举报
回复
我说怎么回速呢

我在服务器端能够保存多项,这里只保存工项

现在知道原因了,谢了
yyg990441 2010-03-07
  • 打赏
  • 举报
回复
楼上正解.将char*改用string就可以了,代码如下:

#include <iostream>
#include <sstream>
#include <string>
#include <map>

using namespace std;

//map<char*,int >NameMessage;
map<string,int >NameMessage;
int main()
{
//map <char*,int>::iterator iter;
map <string,int>::iterator iter;
string str="fsdf|233#fdf|34443#fd|45454";

stringstream ss(str);
string sub_str;
char name[20];
while(getline(ss,sub_str,'#')) //以#为间隔分割test的内容
{
int n=0;
n=sub_str.find_last_of('|');
::strncpy(name,str.c_str(),n);
name[n]='\0';
int m=0;
m+3;

NameMessage[name]=m;//加入map里面
}

for(iter=NameMessage.begin ();iter!=NameMessage.end ();++iter)
{
cout<<iter->first<<iter->second <<endl;
}

}
zsewqscdwax 2010-03-07
  • 打赏
  • 举报
回复
当然只有一个,这里map以地址作索引,name地址while时就没变过

64,644

社区成员

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

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