这个问题怎么解决(输出问题)
#include <cstdlib>
#include <iostream>
#include <map>
#include <string>
using namespace std;
map <int,int> m1;
map <char,int> m2;
string s;
int cnt;
int main(int argc, char *argv[])
{
cout < < "Input string: " < <ends;
cin> > s;
for(string::iterator ix=s.begin();ix!=s.end();ix++){
if(isdigit(*ix)){
cnt=count(s.begin(),s.end(),*ix);
m1[*ix]=cnt;}
else{
cnt=count(s.begin(),s.end(),*ix);
m2[*ix]=cnt;
}
}
for(map <int,int> ::iterator it=m1.begin();it!=m1.end();it++)
cout < < "数字: " < <(*it).first < < " 出现: " < <(*it).second < < "次. " < <endl;
for(map <char,int> ::iterator it=m2.begin();it!=m2.end();it++)
cout < < "字母: " < <(*it).first < < " 出现: " < <(*it).second < < "次. " < <endl;
system( "PAUSE ");
return EXIT_SUCCESS;
}
我觉得应该是
输入:
11av
输出:
数字:1 出现:2次.
字母:a 出现:1次.
字母:v 出现:1次.
但是.
我的DEV-c++结果是
数字:49 出现:2次.
字母:a 出现:1次.
字母:v 出现:1次.
为什么,,高手指点一下
[解决办法]
注意你输入的是 "11av ",string::iterator的referance_type是char&(或其他可以直接转成char&的类型),所以第一和第二个*(ix)返回的是 '1 '而不是1。将字符 '1 '赋给一个int,得到的是它的ASCII码。
如果想要文中希望的语义,可以在if(isdigit(*ix)) 段中这样写
cnt=count(s.begin(),s.end(),*ix);
m1[(*ix)- '0 ']=cnt; // (*ix)- '0 ' 将ASCII的数字转换成了整型的数字