2011-09-09 42 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 –