【问题标题】:Using pointers with structures to pass data to functions使用带有结构的指针将数据传递给函数
【发布时间】:2014-04-01 19:59:12
【问题描述】:

这是一个班级项目的程序。假设能够创建和编辑结构。 CreatRec 函数工作正常。对于 ModifyRec,我试图通过指针将数组发送给它,以避免不得不“复制”数据。但是,我无法让它实际更改数组。 ATM 底部的行 (gr[change].lastname= *info;) 根本不起作用。我真的不知道我在这里做错了什么。

 #include "stdafx.h"
#include <string.h>
#include <stdlib.h>

struct student{
    int recordname;
    char lastname[10];
    char firstname[10];
    float math;
    float english;
    float science;
};

//prototypes
int menu();
struct student  CreatRec(int);
void ModifyRec(struct student*);


void main()
{
    int option, j;//option will be for users menu choice, j makes for loop work for creatrec
    struct student grades[10];
    j = 0;
    option=Menu();
    if (option == 1)
        for (j = 0; j<10; j++)
            (grades[j + 0]) = CreatRec(j);
    else if (option==2)
        ModifyRec(grades);//dont need & is smart bc array


    printf("%s",grades[0].lastname);//This line is checking to see if ModifyRec actaully worked

    //free(grades);2
    while (1);
}


int Menu()
{
    int choi;
    printf("Please choose one of the following options.\n 1) Create  New Student Records.\n 2) Modify an Existing Student Record\n");
    printf(" 3) Print a New Sutdent Record.\n 4) Quit\n");
    scanf("%d", &choi);
    return choi;
}
struct student  CreatRec(int i)
{
    struct student qr;
    //qr = (struct student*)malloc(sizeof(struct student)*6);

    printf("RecordNum %i\n", i);
    printf("Please enter last name-->");
    scanf("%s", &qr.lastname);
    printf("Please enter first name-->");
    scanf("%s", &qr.firstname);
    printf("Please math grade-->");
    scanf("%f", &qr.math);
    printf("Please english grade-->");
    scanf("%f", &qr.english);
    printf("Please science grade-->");
    scanf("%f", &qr.science);
    return qr;
}

void ModifyRec(struct student gr[])
{
    int change;
    char feild[10], info[10];

    printf("Which record would you like to change?\n");
    scanf("%d", &change);
    rewind(stdin);
    printf("Which feild would you like to edit?\n");
    scanf("%s", &feild);
    rewind(stdin);
    printf("Enter info\n");
    scanf("%s", &info);

    if (!strcmp("lastname", feild))
        gr[change].lastname= *info;//NOT WORKING

}

【问题讨论】:

  • 为什么是 C++ 标签?错字?
  • 网站为我写了这个标签
  • 当我没有倒带时,它不允许在下次输入信息时输入信息

标签: c arrays pointers structure


【解决方案1】:

首先我看不出grades[j + 0]的表达有什么意义

    for (j = 0; j<10; j++)
        (grades[j + 0]) = CreatRec(j);

这些陈述

printf("Please enter last name-->");
scanf("%s", &qr.lastname);
printf("Please enter first name-->");
scanf("%s", &qr.firstname);

必须替换

printf("Please enter last name-->");
scanf("%s", qr.lastname);
printf("Please enter first name-->");
scanf("%s", qr.firstname);

还有这句话

if (!strcmp("lastname", feild))
    gr[change].lastname= *info;//

必须替换

if (!strcmp("lastname", feild))
    strcpy( gr[change].lastname, info );

【讨论】:

  • 好的,你的第二次替换效果很好,非常感谢!但是,第一个不起作用,它归结为扫描整数。至于第一位,我有一个由 10 个结构组成的数组,所以我必须用 creatrec 填写所有 10 个
  • @user3486669 您必须在输入正确的每个数据后输入ENTER键。
  • 我不太确定我明白你的意思
  • @user3486669 当您输入例如姓氏时,请按 Enter 键
  • 哦,是的,我知道,它只对字符起作用,而不是浮点数
【解决方案2】:

gr[change].lastname 是一个字符数组,而不是一个指针。你不能重新分配它。在这种情况下,您可能应该执行scanf("%s", gr[change].lastname); 并完全跳过char info[10]

【讨论】:

  • 好的,但稍后我如何允许他们编辑其他字段,(名字)等。你是说我应该为每个字段设置 scanf("%s", FEILD) 吗?跨度>
  • 你可以。另一种可能性是设置char *destination 指向特定字段,然后设置scanf("%s", destination)
猜你喜欢
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2019-05-03
  • 1970-01-01
  • 2021-07-17
相关资源
最近更新 更多