【问题标题】:Setting the attributes of a struct in an array of structs with fscanf使用 fscanf 在结构数组中设置结构的属性
【发布时间】:2011-07-04 14:06:38
【问题描述】:

Seg Fault 不是由于 ScanF 而发生的,而是由于我的 Main 函数出现问题。

我正在尝试读取一些数据文件,当我尝试使用 fscanf 时,我的程序出现了段错误。这是我所拥有的:

while(fscanf(fr, "%d%s%d%d", riderArray[numberOfRiders].arrivalTime, riderArray[numberOfRiders].riderNumber,    riderArray[numberOfRiders].floorArrival, riderArray[numberOfRiders].floorDestination)!= EOF)
     {
     numberOfRiders++;
     }

预期目标是将每一行(保证格式为int string int int)解析为一个结构,直到读取file fr 中的所有数据。

这种方式可行吗?

我想替代方案只是:

while(fscanf(fr, "%d%s%d%d", &temp1, &tempS, &temp2, &temp3)!= EOF)
     {
         riderArray[numberOfRiders].riderNumber = temp1;
         etc. etc.
     numberOfRiders++;
     }

使用临时变量来避免完全组合 fscanf、结构和数组(无论如何,这可能会更清晰。

这是结构:

typedef struct rider
{
    char  riderNumber[5];
    int  timeWaiting;
    int  jobLength;
    int  arrivalTime;
    int  floorArrival;
    int  floorDestination;

} rider; 

【问题讨论】:

  • 你能提供结构的定义吗?
  • @Blag -- 这是一个很好的观点。完成。
  • 第一项应该是char riderNumber[5](假设您不需要指针数组)。

标签: c arrays struct scanf


【解决方案1】:

你必须给 fscanf 一些指示:

while(
    fscanf(fr, "%d%s%d%d",
        &riderArray[numberOfRiders].arrivalTime,
        riderArray[numberOfRiders].riderNumber,    // this is already a pointer
        &riderArray[numberOfRiders].floorArrival,
        &riderArray[numberOfRiders].floorDestination
    ) != EOF
)

【讨论】:

  • -1:你不知道struct成员是否定义为指针,括号是不必要的
  • @Blagovest Buyukliev:是的,但通常当类似 fscanf 的函数出现段错误时,参数有问题。至少,这些是我检查的第一件事。和括号是为了可读性,我喜欢它们:)
【解决方案2】:

我注意到您没有在实际代码中使用指针,即使您的临时示例中有指针。

fscanf(fr, "%d%s%d%d", &riderArray[numberOfRiders].arrivalTime, riderArray[numberOfRiders].riderNumber, &riderArray[numberOfRiders].floorArrival, &riderArray[numberOfRiders].floorDestination)

请注意,riderNumber 不使用“address-of”运算符 (&),因为它是一个数组。

【讨论】:

    【解决方案3】:

    按照您首先描述的方式,这当然是可行的。如果我们有你的结构的声明和定义,调试会容易一些。我注意到的一件事是riderArray[numberOfRiders].arrivalTime 似乎是一个值。在fscanf 中,您需要将其作为值的地址

    【讨论】:

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