Маловероятно, что ваша программа выдаст опубликованный вывод. Фрагмент кода обрабатывает только одну строку, и char *table[5];
неинициализирован, поэтому печать строк из table[0]
, table[2]
, table[3]
и table[4]
имеет неопределенное поведение. Вы указали, что строки читаются из файла, для точного и правильного анализа требуется публикация полной программы. Не инициализация массива является проблемой в случае, если файл не охватывает все записи, было бы невозможно определить, какие из них были установлены, а какие нет.
Если ваша программа считывает строки из файла или стандарта input, анализируя их с помощью strtok
, возвращает указатели на исходную строку, которая является массивом, в который вы читаете строки из файла. Следовательно, все записи в массиве table[]
указывают на один и тот же байт в этом массиве, что объясняет вывод, который вы получаете: 5-кратное содержимое последней строки.
Вы должны сделать копию сохраненной строки в таблице:
table[tableNumber] = strdup(name);
Вот завершенная и измененная программа:
#include <stdio.h>
#include <string.h>
int main() {
char *table[5] = { NULL, NULL, NULL, NULL, NULL };
char buffer[50];
char *number;
char *name;
int tableNumber;
for (int i = 0; i < 5; i++) {
if (!fgets(buffer, sizeof buffer, stdin))
break;
number = strtok(buffer, "-");
if (number == NULL) {
printf("empty line\n");
continue;
}
name = strtok(NULL, "-\n");
if (name == NULL) {
printf("no name after -\n");
continue;
}
tableNumber = atoi(number);
if (tableNumber < 0 || tableNumber >= 5) {
printf("invalid number: %d\n", tableNumber);
continue;
}
table[tableNumber] = strdup(name);
}
for (int i = 0; i < 5; i++) {
if (table[i])
printf("table %d = %s\n", i, table[i]);
}
for (int i = 0; i < 5; i++) {
free(table[i]);
}
return 0;
}
Если ваша целевая система не поддерживает strdup()
, используйте это:
#include <stdlib.h>
#include <string.h>
char *mystrdup(const char *s) {
size_t size = strlen(s) + 1;
char *p = malloc(size);
return (p != NULL) ? memcpy(p, s, size) : NULL;
}