2013-08-20 4 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 ?? 
} 

я понял, как это проверка и установка алфавитов в сек [], как 1-й в array_count массива, который является набором алфавита. Это правильно ?

+3

Это вычисление гистограммы входной строки. 'array_count' - гистограмма' s'. – sgarizvi

+0

Да, вы правы. – Naren

+0

Спасибо, ребята. Это очень помогает. – Angel

ответ

2

В коде хранится гистограмма того, сколько раз данный символ появляется в строке. Каждый раз, когда символ появляется в строке, элемент массива, соответствующий значению ASCII этого символа, увеличивается на единицу.

Элементы в 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 из-за двух 'a' s в "aloha"; array_count [0] будет 1 из-за символа NUL в конце "aloha"; и вы можете понять, что будет остальной частью массива (в основном нулями).

+0

Спасибо за пошаговое объяснение заявления. Довольно ясно теперь с концепцией. – Angel

+0

Обратите внимание, что это концептуальное объяснение, а не фактическая модель того, что происходит в памяти. Компилятор может оптимизировать код по-разному. – verbose

+0

Да, я понимаю. Это помогает лучше понять утверждение. – Angel

2

Каждый char в s[] имеет unsigned int значение (как правило, это значение ASCII) включительно между 0 и 255. array_count[] инициализируется всеми нулями memset. Затем, итерацией через s[] от начала до конца с i в цикле for, значение каждого char используется для индексации в array_count[] и приращения его значения с помощью ++. Таким образом, вы получаете количество значений char в s[].

+0

Splendid.Это было очень тщательно. Читает все мои вопросы. Спасибо! – Angel

+0

За исключением явно выраженного приведения, 'char' по умолчанию подписан на наиболее часто используемых платформах ... Что означает, что если строка содержала любой символ, отличный от ASCII, это привело бы к Undefined Behavior от индексации массива с отрицательным значением. – 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