【问题标题】:store values to struct array values C将值存储到结构数组值 C
【发布时间】:2014-06-27 23:05:36
【问题描述】:

我正在尝试读取文件并将值存储到结构数组中,然后将值传递给函数。第一个 printf 显示正确的值,但第二个给出全 0。当将值传递给函数时,它也传递全 0。

input data
0   1
0   2 
0   3
0   4
0   5
typedef struct  
{
  int brust_time[MAX];
  int arrival_time[MAX];
}Time;


int main()
{ 
  Time *foo;
  FILE *fr;
  char str[10];
  int x = 0;
  int m;

  fr = fopen("read.txt", "rt");

  while(fgets(str, 10, fr) != NULL)
  {
    x++;
    foo = (Time *) malloc(sizeof(Time));
    sscanf(str, "%d  %d", foo[x].arrival_time,foo[x].brust_time );
    printf("x: %d B:%d\n", *foo[x].arrival_time, *foo[x].brust_time);
  }

  for( m = 0; m <x; m++)
    printf("*****x: %d ******B:%d\n", *foo[m].arrival_time, *foo[m].brust_time);

  SJF(foo[x].brust_time,foo[x].arrival_time, x);
  fclose(fr);

  return 0;
}

【问题讨论】:

  • Foo 在每次迭代中都被设置为一个新的内存范围。你没有数组。您只能获得最后一次运行的最后一个句柄。您可以将其设为链表,并为前一个 foo 分配一个名为 next 的下一个 foo 的属性。研究链接列表。
  • 很抱歉,您所拥有的东西太多了。开始时要小得多(读取一行,不要动态分配任何东西,并确保添加代码来检查所有可能失败的函数的返回值 - 即至少 fopen 和 scanf)。将编译器的警告打开到最大,并修复所有错误和警告(修复,不要隐藏)。仅当该程序 100% 运行时,即使您输入错误的输出,您也应该继续。确保您也了解数组和指针之间的区别。

标签: c arrays struct parameter-passing


【解决方案1】:

大概是这样的:

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

#define MAX 10

typedef struct 
   {
   int brust_time;
   int arrival_time;
   }Time;

int main()
   {
   int rCode=0;
   Time *foo = NULL;
   FILE *fr = NULL;
   char str[10];
   int x = 0;
   int m;

   /* Open the data file in read (text) mode) */
   errno=0;
   fr = fopen("read.txt", "rt");
   if(NULL == fr)
      {
      rCode=errno;
      fprintf(stderr, "fopen() failed.  errno[%d]\n", errno);
      goto CLEANUP;
      }

   /* Allocate an array of 'Time' structures large enough to hold all the data. */
   foo = malloc(MAX * sizeof(Time));
   if(NULL == foo)
      {
      rCode=ENOMEM;
      fprintf(stderr, "malloc() failed.\n");
      goto CLEANUP;
      }

   /* Read, parse, and store each line's data in the array of structures. */
   while(x<MAX)
      {
      /* Read a line. */
      errno=0;
      if(NULL == fgets(str, 10, fr))
         {
         if(feof(fr))
            break;

         rCode=errno;
         fprintf(stderr, "fgets() failed.  errno[%d]\n", errno);
         goto CLEANUP;
         }

      /* Parse & store */ 
      sscanf(str, "%d  %d", &foo[x].arrival_time, &foo[x].brust_time );
      ++x;
      }

   /* Generate report. */
   for(m = 0; m < x; m++)
       printf("*****x: %d ******B:%d\n", foo[m].arrival_time, foo[m].brust_time);

/* Restore system. */
CLEANUP:

   /* Free Time structure array. */
   if(foo)
      free(foo);

   /* Close the file. */
   if(fr)
      fclose(fr);

   return(rCode);
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2010-11-10
    • 2022-01-18
    相关资源
    最近更新 更多