#c #struct #strcpy
#c #структура #strcpy
Вопрос:
Я пытаюсь скопировать строки из поля в одной структуре в другую структуру (узел), чтобы в конечном итоге создать хеш-таблицу. Однако, похоже, у меня возникли некоторые проблемы при фактическом копировании строки. Я создал цикл for для перебора строк в исходной структуре, и я знаю, что итерация работает нормально, потому что, если я печатаю исходные строки (data[i].c_name), они печатаются нормально. К сожалению, когда я пытаюсь напечатать адрес назначения (class_id), он кажется пустым (и, следовательно, конечно, моя хэш-функция мало что делает). Любая информация о потенциальной проблеме здесь была бы весьма признательна. Пожалуйста, дайте мне знать, если я не предоставил достаточного контекста.
#define LENGTH 30
#define MAX_OBS 80000
typedef struct
{
char c_name[LENGTH];
char s_name[LENGTH];
double value[MAX_OBS];
}
sample;
typedef struct node
{
char class_id[LENGTH];
struct node *next;
}
node;
{
char class_id[LENGTH];
for (int i = 0; i < total_columns; i )
{
// malloc a new node pointer for each new class label
node *new_node = malloc(sizeof(node));
// check that there was sufficient memory
if (new_node == NULL)
{
return 6;
}
// copy c_name into node -- failing - class_id is empty
strcpy(new_node->class_id, data[i].c_name);
printf("%sn", class_id);
}
}
Ответ №1:
Удалите последний char class_id[LENGTH];
, который вы печатаете, поскольку он никогда не был инициализирован. Затем переключите ваш printf() на использование фактического целевого объекта strcpy.
strncpy(new_node->class_id, данные[i].c_name, ДЛИНА); printf("%.*s n", ДЛИНА, new_node-> class_id);
Я также установил несколько ограничений по длине в своем коде, чтобы гарантировать, что вы не будете делать плохие вещи при неправильном вводе без терминала 0 . Никогда не доверяйте слепо своему вводу C, если вы не сгенерировали его безотказным способом.
Отказ от ответственности: изменения в проверке рабочего стола. Фактическая отладка оставлена в качестве упражнения для учащегося.
Комментарии:
1. Ах, фантастика! Спасибо, Гилберт! Я немного запутался концептуально, хотя — new_node просто указывает на class_id , так почему печать class_id не будет работать? Кроме того, я определенно могу оценить важность обеспечения того, чтобы копировалась только разрешенная ДЛИНА, но поскольку оба поля определены одинаковой ДЛИНОЙ, почему было бы небезопасно оставить это выключенным? Еще раз спасибо за вашу помощь!
2. @AllieH Локальная переменная с именем new_node не указывает на локальную переменную с именем class_id . Локальная переменная с именем new_node указывает на узел, у которого есть член, также называемый class_id, который не связан с локальной переменной с именем class_id .