2013-08-20 76 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