2013-08-20 74 views
0

我遇到了一些基於來自不同數組的值進行索引的示例。 實施例:作爲不同數組索引的數組元素

char s[] = "aloha"; 
int l= strlen(s); 
int array_count[256]; 
memset(array_count,0,256*sizeof(int)); 

for(int i=0;i<l;i++) 
{ 
array_count[s[i]]++;// What exactly happens in this statement ?? 
} 

我理解它,因爲它檢查並以s設定字母[]爲1層的在陣列array_count,這是字母集。是對的嗎 ?

+3

據計算所述輸入字符串的直方圖。 'array_count'是's'的直方圖。 – sgarizvi

+0

是的,你是對的.. – Naren

+0

謝謝你們。這有很大幫助。 – Angel

回答

2

代碼保留給定字符出現在字符串中的次數的直方圖。每當字符出現在字符串中時,與該字符的ASCII值對應的數組元素就加1。

array_count []中的元素全部設置爲0您的memset()。然後你的循環迭代通過s[]。因此,在第一次迭代:

array_count [s[i]]++ // first evaluate [i] 
array_count [s[0]]++ // i is zero 
array_count ['a']++ // s[0] is 'a' 
array_count [97]++  // promotion of 'a' from char to int; ASCII value of 'a' is 97 

array_count [97]爲零,因爲memset的,所以因爲++它被加至1

類似魔術在隨後的迭代中人物的休息情況;當循環終止時,array_count [97]將爲2,因爲"aloha"中的兩個'a';由於在"aloha"末尾的NUL字符,array_count [0]將爲1;你可以找出數組的其餘部分(大部分爲零)。

+0

感謝您對該聲明的逐步解釋。現在很清楚這個概念。 – Angel

+0

請注意,這是一個概念性解釋,而不是內存中發生的實際模型。編譯器可能會不同地優化代碼。 – verbose

+0

是的,我明白了。這有助於更好地理解說明。 – Angel

2

每個chars[]具有unsigned int值(通常是ASCII值)包含性0255之間。 array_count[]memset初始化爲全零。然後,通過s[]i開始循環遍歷for循環,每個char的值用於索引到array_count[]並使用++遞增它的值。因此,您可以獲得s[]中的char值。

+0

Splendid.That非常精巧。清除我所有的問題。謝謝! – Angel

+0

除非沒有明確的強制轉換,'char'在大多數平臺上默認是被簽名的......這意味着如果字符串包含任何非ASCII字符,則會導致未定義行爲將數組索引爲負值。 – Medinoc

+0

是否有不同的方法檢查非ASCII字符的字符串?我需要什麼樣的明確演員? – Angel

0

256可能是字符串中的字母。看到ascii表。

http://www.asciitable.com/

for(int i=0;i<l;i++) 
{ 
    array_count[s[i]]++; // What exactly happens in this statement ?? 

for i=0 

s[i] = 'a' 

ascii value of 'a' is 97 

so it will increment arry_count[97] value from 0 to 1 



} 
+1

感謝您的回答! – Angel