【问题标题】:Data saved correctly using fprintf but prints out weird values使用 fprintf 正确保存数据但打印出奇怪的值
【发布时间】:2019-03-05 15:26:50
【问题描述】:

我已经创建了一个结构:

typedef struct aeroplane
{
  int seat;
  char rsv[10];
  char fName[20];
  char lName[20];
} AERO;

并在主函数中创建了一个数组,然后对其进行初始化:

#define ROWS 3
#define COLS 4

AERO arr[ROWS][COLS] =
  {
    {
      {0, "Empty", "NULL", "NULL"},
      {0, "Empty", "NULL", "NULL"},
      {0, "Empty", "NULL", "NULL"},
      {0, "Empty", "NULL", "NULL"}
    },
    {
      {0, "Empty", "NULL", "NULL"},
      {0, "Empty", "NULL", "NULL"},
      {0, "Empty", "NULL", "NULL"},
      {0, "Empty", "NULL", "NULL"}
    },
    {
      {0, "Empty", "NULL", "NULL"},
      {0, "Empty", "NULL", "NULL"},
      {0, "Empty", "NULL", "NULL"},
      {0, "Empty", "NULL", "NULL"}
    }
  };

我用这个函数把数组保存到test.dat

void save(AERO * arr, FILE * fp)
{
  for (int i = 0; i < ROWS; i++)
  {
    for (int j = 0; j < COLS; j++)
    {
      fprintf(fp, "%d %s %s %s\n",
      ((arr + i) + j) -> seat, ((arr + i) + j) -> rsv, ((arr + i) + j) -> fName, ((arr + i) + j) -> lName);
    }
    fprintf(fp, "\n");
  }
}

这是test.dat 显示的内容:

0 Empty NULL NULL
0 Empty NULL NULL
0 Empty NULL NULL
0 Empty NULL NULL

0 Empty NULL NULL
0 Empty NULL NULL
0 Empty NULL NULL
0 Empty NULL NULL

0 Empty NULL NULL
0 Empty NULL NULL
0 Empty NULL NULL
0 Empty NULL NULL

这看起来像我想要的。

但是,当我使用这个函数来检索数据时:

void read(AERO * arr, FILE * fp)
{
  for (int i = 0; i < ROWS; i++)
  {
    for (int j = 0; j < COLS; j++)
    {
      fscanf(fp, "%d %s %s %s",
      &((arr + i) + j) -> seat, ((arr + i) + j) -> rsv, ((arr + i) + j) -> fName, ((arr + i) + j) -> lName);
    }
  }
}

然后打印出来:

for (int i = 0; i < ROWS; i++)
  {
    for (int j = 0; j < COLS; j++)
    {
      printf("dummy[%d][%d]\nseat = %d\nrsv = %s\nfName = %s\nlName = %s\n\n",
      i, j, dummy[i][j].seat, dummy[i][j].rsv, dummy[i][j].fName, dummy[i][j].lName);
    }
  }

输出不是我想要的:

dummy[0][0]
seat = 0
rsv = Empty
fName = NULL
lName = NULL

dummy[0][1]
seat = 0
rsv = Empty
fName = NULL
lName = NULL

dummy[0][2]
seat = 0
rsv = Empty
fName = NULL
lName = NULL

dummy[0][3]
seat = 0
rsv = Empty
fName = NULL
lName = NULL

dummy[1][0]
seat = 0
rsv = Empty
fName = NULL
lName = NULL

dummy[1][1]
seat = 0
rsv = Empty
fName = NULL
lName = NULL

dummy[1][2]
seat = 0
rsv =
fName =
lName = ▒▒

dummy[1][3]
seat = -2144188312
rsv =
fName =
lName =

dummy[2][0]
seat = 0
rsv =
fName =
lName =

dummy[2][1]
seat = 970037024
rsv = ▒
fName =
lName = ▒

dummy[2][2]
seat = -14080
rsv =
fName =
lName =

dummy[2][3]
seat = 31
rsv =
fName =
lName =

我希望输出具有我已经定义的 3 行和 4 列。但它不仅返回较小的值,而且还返回损坏的值。我错过了什么吗?

【问题讨论】:

  • AERO[ROWS][COLS]AERO* 不兼容。打开编译器警告并注意警告
  • @Jabberwocky 我会更简洁地编辑它。谢谢。
  • @pmg 哦,我才意识到这个问题有多荒谬。唯一的问题是函数将指针作为参数。
  • 函数:read() 是一个众所周知的 C 库函数。最好不要将 c 库函数名称用作函数名称。建议使用“活跃”的东西,例如getSeatInfo()

标签: c printf scanf fopen


【解决方案1】:

AERO[ROWS][COLS]AERO* 不兼容。打开编译器警告并注意警告。 – pmg

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多