В этом коде есть ряд проблем. Пройдем через него по строкам:
#include<stdio.h>
#define M 3
struct class_stud
{
char name[16];
char subject[16];
int roll_num;
}
Первая проблема; вам нужно закрыть ;
после определения структуры выше.Кроме того, интересно, что вы не определяете макрос препроцессора для длин массивов name
и subject
, но это незначительная проблема на данный момент.
struct node
{
int n;
struct branch *p[M];
struct class_stud cls[M-1];
}*root=NULL;
Где находится определение для struct branch
? Что должно представлять p
в определении структуры? Почему у вас есть меньше элементов в cls
, чем p
?
main()
По C99, вы не можете уйти с неявным типом для main
; он должен быть явно введен для ввода int
. И, так как вы не баловаться с любыми аргументами командной строки, то лучше явно задать список параметров для void
, например, так:
int main(void)
{
int clsf_cnt;
struct class_stud clsf, *clsf_ptr;
clsf_ptr = &clsf;
Какой цели служить вышеописанной операции?
clsf_cnt = 0;
root = malloc(sizeof (struct node));
Это прекрасно, но предпочтительный способ написания этого будет
root = malloc(sizeof *root);
Таким образом, вы будете уверены, что выделить нужное количество памяти, основываясь на типе root
«s.
printf("enter source address \n");
scanf("%s",&root.clsf_ptr[clsf_cnt]->name);
Ack. Несколько проблем в этой строке.
Прежде всего, clsf_ptr
является не членом struct node
. Вероятно, вы хотели получить доступ к cls
. Во-вторых, поскольку root
является указателем на структуру, вам необходимо использовать оператор ->
для доступа к его членам (или явно разыменовать root
, а затем использовать .
). В-третьих, cls[clsf_cnt]
является не указателем типа, поэтому вы должны использовать оператор .
для доступа name
. Наконец, поскольку name
является типом массива, он будет неявно преобразован в тип указателя перед передачей scanf
, поэтому &
не требуется.
Чтобы избежать переполнения буфера, вы должны либо установить максимальную ширину поля в спецификаторе преобразования %s
, либо использовать fgets()
вместо scanf()
.
Вставлять с scanf()
, что линия должна быть записана в виде
scanf("%15s", root->cls[clsf_cnt].name);
Я использую 15 вместо 16 в спецификаторе преобразования так, что мы оставляем один символ для 0 терминатора.
Использование fgets(), эта линия была бы написана
fgets(root->cls[clsf_cnt].name, sizeof root->cls[clsf_cnt].name, stdin);
printf("%s",root.clsf_ptr[clsf_cnt]->name);
Опять же, вы пытаетесь получить доступ то, что не является членом root
, и у вас есть операторы доступа в обратном направлении:
printf ("%s", root->cls[clsf_cnt].name);
printf("enter key\n");
scanf("%d",&root.clsf_ptr[clsf_cnt]->key);
printf("%d",root.clsf_ptr[clsf_cnt] -> key);
struct class_stud
не имеет ни одного имени по имени key
; возможно, вы имели в виду roll_num
?
scanf("%d", &root->cls[clsf_cnt].roll_num);
printf("%d", root->cls[clsf_cnt].roll_num);
clsf_cnt++;
}
Похоже, вы отправили то, что не было полным; убедитесь, что вы показываете нам тот же код, который вы пытаетесь построить.
Вставьте точное сообщение об ошибке или вывод компилятора, чтобы мы могли помочь вам лучше. – vz0