2011-09-09 39 views
-2

我写了下面的代码来计算在给定char字符数组的次数计数字符

#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 

char f[]={'a','a','b','c','c','d','d','f','e','e'}; 
int n=sizeof(f)/sizeof(char); 
char max=f[0]; 
for (int i=1;i<n;i++) 
{ 
    if(f[i]>max) 
    { 
     max=f[i]; 
    } 
} 

int m=(int)(max)+1; 
int *b=new int [m]; 

for (int i=0;i<n;i++) 
{ 
    b[(int)(f[i])]++; 
} 

for (int i=0;i<m;i++) 
{ 
    if(b[i]!=0) 
    { 
    cout<<(char)(i)<<" occurs "<<b[i]<< "times "<<endl; 
    }  
} 

return 0; 
} 

但它显示了非常坏的结果

occurs -842150451times 
☺ occurs -842150451times 
☻ occurs -842150451times 
♥ occurs -842150451times 
♦ occurs -842150451times 
♣ occurs -842150451times 
♠ occurs -842150451times 
occurs -842150451times 
occurs -842150451times 
     occurs -84215045 

occurs -842150451times 
♂ occurs -842150451times 
♀ occurs -842150451times 
occurs -842150451times 
♫ occurs -842150451times 
☼ occurs -842150451times 
► occurs -842150451times 
◄ occurs -842150451times 
↕ occurs -842150451times 
‼ occurs -842150451times 
¶ occurs -842150451times 
§ occurs -842150451times 
▬ occurs -842150451times 
↨ occurs -842150451times 
↑ occurs -842150451times 
↓ occurs -842150451times 
→ occurs -842150451times 
← occurs -842150451times 
∟ occurs -842150451times 
↔ occurs -842150451times 
▲ occurs -842150451times 
▼ occurs -842150451times 
    occurs -842150451times 
! occurs -842150451times 
" occurs -842150451times 
# occurs -842150451times 
$ occurs -842150451times 
% occurs -842150451times 
& occurs -842150451times 
' occurs -842150451times 
(occurs -842150451times 
) occurs -842150451times 
* occurs -842150451times 
+ occurs -842150451times 
, occurs -842150451times 
- occurs -842150451times 
. occurs -842150451times 
/occurs -842150451times 
0 occurs -842150451times 
1 occurs -842150451times 
2 occurs -842150451times 
3 occurs -842150451times 
4 occurs -842150451times 
5 occurs -842150451times 
6 occurs -842150451times 
7 occurs -842150451times 
8 occurs -842150451times 
9 occurs -842150451times 
: occurs -842150451times 
; occurs -842150451times 
< occurs -842150451times 
= occurs -842150451times 
> occurs -842150451times 
? occurs -842150451times 
@ occurs -842150451times 
A occurs -842150451times 
B occurs -842150451times 
C occurs -842150451times 
D occurs -842150451times 
E occurs -842150451times 
F occurs -842150451times 
G occurs -842150451times 
H occurs -842150451times 
I occurs -842150451times 
J occurs -842150451times 
K occurs -842150451times 
L occurs -842150451times 
M occurs -842150451times 
N occurs -842150451times 
O occurs -842150451times 
P occurs -842150451times 
Q occurs -842150451times 
R occurs -842150451times 
S occurs -842150451times 
T occurs -842150451times 
U occurs -842150451times 
V occurs -842150451times 
W occurs -842150451times 
X occurs -842150451times 
Y occurs -842150451times 
Z occurs -842150451times 
[ occurs -842150451times 
\ occurs -842150451times 
] occurs -842150451times 
^ occurs -842150451times 
_ occurs -842150451times 
` occurs -842150451times 
a occurs -842150449times 
b occurs -842150450times 
c occurs -842150449times 
d occurs -842150449times 
e occurs -842150449times 
f occurs -842150450times 

请帮我什么是错?

+1

您的第一个任务是正确缩进您的代码,以使其易读。 –

回答

4

您必须初始化“malloc”ed(new)区域为0,它包含垃圾。

+0

我忘了谢谢@yi_H –

+0

这不是问题,名为“b”的数组已正确初始化。实际的问题是该数组中的索引错误。 – Yexo

+0

@Yexo:我不知道你在说什么。 –

1

那么,你的B排列未初始化...

我的2美分

1

分配的缓冲区应该被初始化为零

int *b=new int [m];
memset(b, 0, sizeof(int) * m);

+0

不错的变体谢谢@ 6bb79df9 –

1

不知道我要通过这个挖代码,但是由于您将此标记为C++,因此我推荐使用C++方法来执行此操作:

#include <map> 
#include <iostream> 

std::map<char, unsigned int> histogram; 

// Counting 
for (char * it = f; it != f + sizeof(f); ++it) 
    ++histogram[*it]; 

// Reporting 
for (std::map<char, unsigned int>::const_iterator it = histogram.begin(); it != histogram.end(); ++it) 
    std::cout << "Character '" << it->first << "' appears " << it->second << " times.\n"; 

没有手动内存分配,没有忘记清理,而且相当自我描述。 (如果数组f作为没有尺寸信息的指针而来,则必须单独传递尺寸信息并使用该尺寸信息代替sizeof(f)。)

+0

我已经完成了它使用地图它只是训练,谢谢@Kerrek SB,也忘记删除我的阵列这是很好的迹象 –

+0

好吧,当然,没有后顾之忧。我不确定这种“培训”对编写好的C++是否有好处,但如果您正在开发对指针和内存分配的熟悉程度,那绝对不是坏事。 –

+0

还有额外的时刻我有考试,并试图用各种方法来解决问题,所以最后非常感谢您的帮助 –

1

实际的“错误”是您没有初始化已分配的内存为零,新的[]不会为你做。

除了使用新的[]你实际上并没有写任何C++,它都是C.为什么不使用向量?这也会将您的值初始化为0。

//顶部

#include <vector> 

然后

std::vector<int> b[m]; 

最后使用标识符,而不是单个字母有意义的名字。

+0

我会考虑将来 –

1

这里有相当多的问题:

你在这里做什么?

char f[]={'a','a','b','c','c','d','d','f','e','e'}; 
int n=sizeof(f)/sizeof(char); 
char max=f[0]; 
for (int i=1;i<n;i++) 
{ 
    if(f[i]>max) 
    { 
     max=f[i]; 
    } 
} 

完成时将指派所述阵列中的最高字符max的值,在此情况下e此代码。

在这里?

int m=(int)(max)+1; 
//cout<<m; 
int *b=new int [m]; 

此代码将分配整数的新的数组,大小m的,这将是'e' + 1。几乎肯定不是你想要的。你希望这是你的字符串的长度(n)。

正如其他人已经指出,b将包含未初始化的值,这也会导致一些不需要的行为。

+0

不,我不同意@chad(int)(max)+ 1首先将最大字符转换为int,然后再加上1,就像这样考虑数组int a [] = {1,2,3,4,5,6}我需要最大值6,因为我们想访问元素6 int我们应该创建一个数组,其编号从0到6,在尝试访问时不会出现任何问题或索引问题6 –

+0

但是max是一个字符'e'。像你一样用'C-style'类型转换成'int'就是给'm'赋值'101'。所以声明'int * b = new int [m]'是声明一个'102'整数的数组。 – Chad

2

正如其他人所说的你犯的错误,我会给你另一种方式。由于有256个ASCII字符,只需分配一个这样大小的字符数组。

char mapCount[256]; 
std::fill(mapCount, mapCount+256, 0); // std::fill is from <algorithm> header 

现在和以前一样,只需遍历输入序列并增加相应的mapCount值即可。即,

++mapCount[(int)inputSequence[i]]; 

最后输出mapCount指标,其值大于0转换为char会给你的实际字符的索引。正如@Kerrek SB所建议的那样,有一种与价值关联的概念。不过,您可以使用关联容器std :: map执行此任务。

+0

非常感谢@Mahesh –