Почему мой двумерный массив отображает правильное значение в индексе, когда я помещаю значения, а не то, что я пытаюсь получить к ним позже? (С) - PullRequest
0 голосов
/ 07 октября 2019

Я пишу программу, которая читает теневой файл linux, разделяет каждую строку на ID, соль и хэш для зашифрованного пароля. Я создал 2-мерный массив символов для каждого из этих значений и заполняю его значениями, проходя каждую строку. Когда я ввожу эти значения в массив, я распечатываю его только для того, чтобы показать, что он вводит правильное значение следующим образом:

printf(id: %s, salt: %s", ids[num_accounts], salts[num_accounts]);

Результаты этого следующие:

id: root, salt: NrF46O1p
id: seed, salt: wDRrWCQz
id: user1, salt: LGOwUL7Q
id: user2, salt: CL5Fr2bN
id: user3, salt: Un/lqxkl
id: user4, salt: Lx2zrG31
id: user5, salt: 6R1eYOtL

Это делается при каждом вводе значения. После того, как все значения введены и программа вышла из цикла while, есть еще один цикл for для вывода всех значений (для целей отладки)

for(int i = 0; i < num_accounts; i++){
     printf("salt %d: %s\n", i, salts[i]);

Результаты этого следующие:

salt 0:
salt 1:
salt 2: 6R1eYOtL
salt 3: 6R1eYOtL
salt 4: 6R1eYOtL
salt 5: 6R1eYOtL
salt 6: 6R1eYOtL
salt 7: (null)

Вот мой код для выделения 2-мерных массивов и его заполнения:

char **ids;
char **hashes;
char **salts;

hashes = malloc((num_accounts + 1) * sizeof(char*));
salts = malloc((num_accounts + 1) * sizeof(char*));
ids = malloc((num_accounts + 1) * sizeof(char*));

for(int i = 0; i < num_accounts; i++){
     hashes[i] = malloc(88);
     salts[i] = malloc(8);
     ids[i] = malloc(15);
}

shadow = fopen("shadow", "r");
num_accounts = 0;
while(fgets(shdw_line, SHDW_LINE_LEN, shadow)!=NULL){
     char *token = strtok(shdw_line, ":");
     char *shdw_hash = strtok(NULL, ":");
     if(strcmp(shdw_hash, "*")!=0 && strcmp(shdw_hash, "!")!=0){
        ids[num_accounts] = token;
        token = strtok(shdw_hash, "$");
        token = strtok(NULL, "$");
        salts[num_accounts] = token;
        token = strtok(NULL, "$");
        hashes[num_accounts] = token;
        printf("%d: id: %s, salt: %s\n", num_accounts, ids[num_accounts], salts[num_accounts]);
        num_accounts++;
     }
}

Мне интересно, почему массив перезаписывается последним введенным значением?

1 Ответ

0 голосов
/ 07 октября 2019

солей [i] = malloc (8);

изменить на

солей [i] = malloc (9); // еще 1 для конца флага строки ее базовые базовые знания


salt [num_accounts] = token; // даст вам указатель исходной строки, так что вы получите все то же

изменится на

strcpy (salt [num_accounts], маркер);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...