strtok
- очень запутанная функция:
- она изменяет массив, на который получает указатель
- , возвращает указатель на элемент этого массива.
- поддерживает внутреннее состояние, что делает его не входящим и не ориентированным на многопотоковое исполнение.
Следовательно username
указывает внутри line
.Вы сохраняете этот указатель в users[counter]
.В конце цикла все записи в users
указывают на один и тот же массив, который был перезаписан при каждом вызове fgets()
.
Вы должны продублировать содержимое массива с помощью strdup()
:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[) {
char *users[51]; //given no more than 50 users
int r;
FILE *fp;
if (argc < 2) {
fprintf(stderr, "missing filename argument\n");
return 1;
}
fp = fopen(argv[1], "r");
if (fp == NULL) {
fprintf(stderr, "cannot open file %s\n", argv[1]);
return 1;
}
char line[100];
int counter = 0;
while (counter < 50 && fgets(line, 100, fp) != NULL) {
char *username = strtok(line, ":");
if (username != NULL) {
users[counter] = strdup(username);
//counter increase for later
counter += 1;
}
}
users[counter] = NULL;
...
}