【问题标题】:How can I read data from user using a struct variable in a function如何使用函数中的结构变量从用户读取数据
【发布时间】:2019-05-10 04:42:19
【问题描述】:

我是一个完全的新手。当我运行程序并输入数据时,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]);
}

【问题讨论】:

  • C 中的参数按值传递。这意味着它们被复制,然后参数变量与调用函数时使用的变量断开连接。修改函数内部的本地副本不会修改原始的。您可能应该了解 指针 以及如何在 C 中模拟通过引用传递
  • int roll_num[0]; 一起创建一个包含 0 个整数空间的数组。如果您只需要 1 个值,请坚持使用简单变量:int roll_num;;如果您需要一个数组,请使用 1 个或多个元素:int roll_num[3]; /* roll_num[0], roll_num[1], and roll_num[2] */

标签: c eclipse gcc struct


【解决方案1】:

您应该知道,在 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);


}

【讨论】:

  • 谢谢,我完全忘记了参数是按值传递的。我目前正在研究指针,虽然理解它们有点困难。
【解决方案2】:

为了在你的函数collect() 中修改传递给它的数据,你需要传递对数据的引用,而不是数据本身。请参阅此accepted answer 了解如何执行此操作。 因此,您将进行以下更改:

使用void collect(struct student_data *data) 代替void collect(struct student_data data),在main() 中使用collect(&amp;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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多