我遇到了一些示例,其中基于来自不同数组的值对数组进行索引。 例如:
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 []中的字母设置为数组array_count中的1,这是字母表集。是吗?
答案 0 :(得分:2)
char
中的每个s[]
都有一个unsigned int
值(通常是ascii值),包含在0
和255
之间。 array_count[]
将memset
初始化为全零。然后,通过s[]
循环中的i
从开始到结束迭代for
,每个char
的值用于索引到array_count[]
并增加这是++
的价值。因此,您可以计算char
中的s[]
值。
答案 1 :(得分: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]
中的两个'a'
,"aloha"
将为2;由于array_count [0]
末尾的NUL
字符,"aloha"
将为1;你可以弄清楚阵列的其余部分(主要是零)。
答案 2 :(得分:0)
256是字母表中的可能字母。请参阅ascii表。
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
}