Как я могу прочитать данные от пользователя, используя переменную структуры в функции - PullRequest
0 голосов
/ 08 декабря 2018

Я полный новичок.Когда я запускаю программу и ввожу данные, функция throw корректно отображает только целочисленное значение, но не отображает символы.

#include<stdio.h>
#include<string.h>

struct student_data{
    char name[20],department[10];
    int roll_num[0];
};
void collect(struct student_data data);
void throw(struct student_data student1);
int main(void){
    struct student_data student1;
    collect(student1);
    throw(student1);
    return 0;
}
void collect(struct student_data data1){
    printf("Enter name:");
    scanf(" %s",data1.name);
    printf("Enter department:");
    scanf(" %s",data1.department);
    printf("Enter roll number:");
    scanf(" %d",data1.roll_num);
}

void throw(struct student_data student1){

    printf("%s\n",student1.name);
    printf("%s\n",student1.department);
    printf("%d\n",student1.roll_num[0]);
}

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Вы должны знать, что в языке программирования C аргументы передаются по значению.Когда вы создаете экземпляр своей структуры в главной функции как struct student_data student1; и затем передаете его функциям collect() и throw(), вы просто передаете его как значение, что означает, что будет создана копия этого экземпляра вфункция и когда функция уничтожается, копия также будет уничтожена, и это никогда не повлияет на ваш реальный экземпляр, который вы создали в основной функции.Чтобы предотвратить это, вам нужно использовать указатели.Проверьте код ниже;

#include<stdio.h>
#include<string.h>

struct student_data{
    char name[20],department[10];
    int roll_num;
};

void collect(struct student_data *data);
void throw(struct student_data *student1);

int main(void){
struct student_data *student1;
collect(&student1);
throw(&student1);
return 0;
}

void collect(struct student_data *data1){
    printf("Enter name:");
    scanf(" %s",&data1->name);
    printf("Enter department:");
    scanf(" %s",&data1->department);
    printf("Enter roll number:");
    scanf(" %d",&data1->roll_num);
}

void throw(struct student_data *student1){

printf("%s\n",student1->name);
printf("%s\n",student1->department);
printf("%d\n",student1->roll_num);


}
0 голосов
/ 08 декабря 2018

Чтобы изменить внутри вашей функции collect() данные, которые ей передаются, вам нужно передать ссылку на данные, а не сами данные.Посмотрите этот принятый ответ , чтобы узнать, как это сделать.Поэтому вы внесете следующие изменения:

используйте void collect(struct student_data *data) вместо void collect(struct student_data data), а в main() используйте collect(&student1) вместо collect(student1).

Ваше использованиеиз roll_num немного хитроумно, поэтому я игнорирую это.Ниже приведена модифицированная версия соответствующих частей вашего кода:

int main(void){
   struct student_data student1;
   collect(&student1);
   throw(student1);
  return 0;
}
void collect(struct student_data *data1){
    printf("Enter name:");
    scanf(" %s",data1->name);
    printf("Enter department:");
    scanf(" %s",data1->department);
//    printf("Enter roll number:");
//    scanf(" %d",data1->roll_num);
}
...