【问题标题】:Wrong int values using struct and arrays [duplicate]使用结构和数组的错误 int 值 [重复]
【发布时间】:2019-01-25 08:12:25
【问题描述】:

您好,我对整数有疑问。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
struct data
{
    char name[50];
    int grade[1];
};

int main()
{
    struct data persons[30];
    int n = 3;
    int i;

    for(i=0;i<n;i++)
    {
        printf("Type person name nr: [%d] ",i+1);
        scanf("%s",persons[i].name);
        printf("Type grade: (from 1 to 6) ");
        scanf("%d",persons[i].grade);
    }

    for(i=0;i<n;i++)
    {
        printf("Name [%d]: %s\n",i+1,persons[i].name);
        printf("Grade [%d]: %d\n",i+1,persons[i].grade);

    }

    return 0;
}

当我输入一些名称和等级时,输出不正确: This is my output

【问题讨论】:

  • 你的编译器应该已经打印了一些警告。如果没有,请使用-Wall 编译。
  • 正确方法&amp;persons[i].grade。请在每次编译程序时使用-Wall-Werror 标志。
  • 这可能是 SO 上关于 scanf 中缺少 & 的第 100 万个问题。投票结束是一个简单的错字。
  • 另外,int grade[1]; 声明了一个包含 1 个整数的数组。虽然单元素数组有合法用途(在某些情况下,您希望地址提供超出结构本身的分配,例如在实现内存分配方案时) - 这不是一个。如果您只需要一个int,请声明int grade; 并删除[1]

标签: c


【解决方案1】:

当标准 int 就足够时,您正在使用一个数组来表示单个成绩。

struct data
{
    char name[50];
    int grade;
};

然后您还需要使用 & 将 int 的引用传递给 scanf。

scanf("%d", &persons[i].grade); 

【讨论】:

  • 哦,我没有这样想。非常感谢
【解决方案2】:

您的程序的更正版本:

#include <stdio.h>
#include <stdlib.h>

struct data {
    char name[50];
    int grade; // In you case, to store one integer value just use int varibale because it seems more logical.
};

int main() {
    struct data persons[30];
    int n = 3;
    int i;

    for (i = 0; i < n; i++) {
        printf("Type person name nr: [%d] ", i + 1);
        scanf("%s", persons[i].name);
        printf("Type grade: (from 1 to 6) ");
        scanf("%d", &persons[i].grade); // To fill member of structure you may use '&' sign because scanf gets address.
    }

    for (i = 0; i < n; i++) {
        printf("Name [%d]: %s\n", i + 1, persons[i].name);
        printf("Grade [%d]: %d\n", i + 1, persons[i].grade);

    }

    return 0;
}

另外,请记住,编译器并不总是告诉您某些事情会出错,在大多数情况下,为编译器使用特殊标志(其中一些我在评论中提到)可以为您提供更多信息。

值得注意的是,当前的 IDE 会突出明显的错误并真正加快您的开发过程。

【讨论】:

    【解决方案3】:

    这是因为grade是一个数组,所以在向它写入或读取数据时需要.grade[0],如下所示:

    scanf("%d",persons[i].grade[0]);
    ...
    printf("Grade [%d]: %d\n",i+1,persons[i].grade[0]);
    

    【讨论】:

    • 谢谢,您的解决方案有效。我不知道为什么有人贬低你
    • 很高兴我能帮上忙 :)
    • scanf("%d",persons[i].grade[0]); 必须是 scanf("%d",&amp;persons[i].grade[0]);
    【解决方案4】:

    你必须更换

    printf("Grade [%d]: %d\n",i+1,persons[i].grade);
    

    通过

    printf("Grade [%d]: %d\n",i+1,persons[i].grade[0]);
    

    在 scanf 你做scanf("%d",persons[i].grade); 所以因为 grade 是一个向量你给它的地址,但在 printf 你必须指定索引否则你打印向量地址

    但是使用向量是没有用的,因为它只包含一个元素,最好直接使用 int 进行评分,当然在这种情况下您必须为 &persons[i].grade >scanfpersons[i].gradeprintf


    执行:

    Type person name nr: [1] a
    Type grade: (from 1 to 6) 1
    Type person name nr: [2] b
    Type grade: (from 1 to 6) 2
    Type person name nr: [3] c
    Type grade: (from 1 to 6) 3
    Name [1]: a
    Grade [1]: 1
    Name [2]: b
    Grade [2]: 2
    Name [3]: c
    Grade [3]: 3
    

    【讨论】:

    • 对不起,结果是一样的。
    • @AdrianFlis 我不知道你是怎么做测试的,但那行得通!
    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2020-09-03
    • 2014-06-12
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多