Вот как бы я решил это:
Сначала определите структуру для хранения имен пользователей и счетчиков частоты и создайте их массив с тем же количеством элементов, что и в вашем массиве userbuffer
(в вашем примере 150).
struct user {
WCHAR name[128];
int count;
} users[150];
Теперь переберите userbuffer
и для каждой записи проверьте и посмотрите, есть ли у вас запись в users
, которая имеет тот же name
. Если вы найдете совпадение, увеличьте count
для этой записи в users
. Если вы не нашли соответствия, скопируйте имя пользователя из userbuffer
в пустую запись в users
и установите для этого пользователя count
значение 1
.
После обработки всего массива userbuffer
вы можете использовать значения count
из массива users
, чтобы узнать, у кого больше всего запросов. Вы можете либо пройти по нему вручную, чтобы найти максимальное значение, либо использовать qsort
.
Это не самый эффективный алгоритм, но он прямой и не делает ничего слишком умного или причудливого.
Edit:
Чтобы qsort массив users
, вам нужно определить простую функцию, которую qsort может использовать для сортировки. Для этого примера примерно так должно работать:
static int compare_users(const void *p1, const void *p2) {
struct user *u1 = (struct user*)p1;
struct user *u2 = (struct user*)p2;
if (u1->count > u2->count)
return 1;
if (u1->count < u2->count)
return -1;
return 0;
}
Теперь вы можете передать эту функцию qsort
, например:
qsort(users, 150, sizeof(struct user), compare_users);