2015-06-21 2 views
-4

Может ли кто-нибудь объяснить мне, за логикой count [* (str + i)] ++. Я знаю, он инициализирует массив count. Но как??. even * (str + i) равно str [i], чем то, как он указывает значение индекса для массива count, n также как он поддерживает количество появления символа в count ?? ThankyouКак инициализировать массив с помощью указателя строки в C++

int *count=(int*)calloc(NO_CHAR,sizeof(int)); 
char str="test string"; 
#define NO_CHAR 256 
fillChar(str,count); 
void fillChar(char *str, int *count){ 
    int i; 
    for(i=0;*(str+i);i++) 
     count[*(str+i)]++; 
} 
+3

«Я знаю», за которым следует некоторое полное недоразумение ... –

+0

Вы не должны передавать указатель, чтобы указать размер 'void fillChar (char * str, int count) {'. –

+0

но почему, ??, у меня не возникло никаких проблем – sa8

ответ

0

*(str + i) такое же, как str[i]. Код создает гистограмму букв в строке:

int * count = calloc(NO_CHAR, sizeof(int)); // array of all zero 

for (i = 0; str[i] != '\0'; ++i) // traverse until null terminator 
    ++count[str[i]];    // increment occurrence count 

В конце, например. count['a'] - количество вхождений персонажа 'a'.

Не забудьте указать free(count); в конце. Но на самом деле, здесь нет необходимости в динамическом распределении, вы можете просто использовать int count[NO_CHAR] = {};.

+0

спасибо, вы действительно даете мне ясный способ, но как он подсчитывает количество случаев? – sa8

+0

@ sa8: Для каждого символа есть один элемент массива: 'count ['a']', 'count ['b']' и т. Д. –

+0

спасибо, я получил его – sa8

0

Прежде всего, я считаю, что манифест константы NO_CHAR должен быть определен до первого утверждения. То есть вместо

int *count=(int*)calloc(NO_CHAR,sizeof(int)); 
char str="test string"; 
#define NO_CHAR 256 
//... 

там должен быть

#define NO_CHAR 256 
int *count=(int*)calloc(NO_CHAR,sizeof(int)); 
char str="test string"; 
//... 

, потому что эта константа используется в вызове calloc.

Что касается программы, то это имеет неопределенное поведение. Тип char может вести себя как тип signed char или как тип unsigned char в зависимости от параметров компилятора.

Таким образом, было бы правильно написать

 count[(unsigned char)*(str+i)]++; 

вместо

 count[*(str+i)]++; 

В противном случае это может произойти таким образом, что индекс (выражение в квадратных brakets) оператора индекса будет отрицательный.

Итак, если переписать этот код правильно

#define NO_CHAR 256 

int *count = (int*)calloc(NO_CHAR, sizeof(int)); 

char str = "test string"; 
fillChar(str,count); 

//... 

void fillChar(char *str, int *count){ 
    int i; 
    for (i = 0; *(str+i); i++) 
     count[(unsigned char)*(str+i)]++; 
} 

затем подсчитывает вхождения символов в строке «тестовой строке». Общее количество символов без знака - 256 (см. #define NO_CHAR 256). Поэтому каждый элемент динамически распределенного массива соответствует некоторому символу. Например, символ 'a' имеет внутренний код ASCII 96. Таким образом, элемент массива с индексом 96 будет содержать количество вхождений символа 'a' в строке. Этот элемент может быть решена, как

count[96] 

Это эквивалентно выражению *(str+i) при условии, что str + i указывает на характер 'a' в исходной строке.

+0

спасибо .... за ценное описание. .. Я понял – sa8

Смежные вопросы