如何用C中的struct修复无限循环

如何用C中的struct修复无限循环,c,struct,sentinel,C,Struct,Sentinel,我在存储数据时遇到结构问题。我想做一个哨兵循环,所以请看一下,帮我谢谢 #include<stdio.h> #include<stdlib.h> struct Vehichle { char vecType[100]; char plateNo[10]; float hours; }; struct Parking { int parkNo ; // 1 =true 0=false int availability; }; int m

我在存储数据时遇到结构问题。我想做一个哨兵循环,所以请看一下,帮我谢谢

#include<stdio.h>
#include<stdlib.h>
struct Vehichle
{
    char vecType[100];
    char plateNo[10];
    float hours;
};
struct Parking
{
  int parkNo ;
  // 1 =true 0=false
  int availability;

};
int main()
{   
  int c = 0;
  int x;
  struct Vehichle vehicle[c];
  struct Parking park[50];


  int counter = 1; 
  while(x!=-1)
  {
    printf("Enter -1 to end: \n");
    scanf("%d", &x);
    printf("Enter Vehicle Type etc: suv,mpv and more:");
    scanf("%d",&vehicle[x].vecType);
    printf("Please enter parking Number :");
    scanf("%d",&park[x].parkNo);

    park[x].availability = 1;

    counter++;  
  }
}
#包括
#包括
结构车辆
{
字符向量类型[100];
炭板[10];
浮动时间;
};
结构停车场
{
国际公园;
//1=真0=假
int可用性;
};
int main()
{   
int c=0;
int x;
结构车辆车辆[c];
结构停车场[50];
int计数器=1;
而(x!=-1)
{
printf(“输入-1以结束:\n”);
scanf(“%d”和&x);
printf(“输入车辆类型等:suv、mpv及更多:”);
scanf(“%d”,&vehicle[x].vecType);
printf(“请输入停车编号:”);
scanf(“%d”,&park[x].park编号);
公园[x]。可用性=1;
计数器++;
}
}

我希望在将其存储到struct中后,程序将循环。

代码中存在许多问题。以下是您的代码,我在其中添加了一些注释:

int main()
{   
  int c = 0;
  int x;                      // UPS: x is uninitialized
  struct Vehichle vehicle[c]; // UPS: c is zero so you don't get an array
  struct Parking park[50];


  int counter = 1; 
  while(x!=-1)                // UPS: Use of uninitialized x
  {
    printf("Enter -1 to end: \n");
    scanf("%d", &x);
    printf("Enter Vehicle Type etc: suv,mpv and more:");
    scanf("%d",&vehicle[x].vecType);             // UPS: vecType is char array so
                                                 // use %s instead of %d
                                                 // and don't use a &
    printf("Please enter parking Number :");
    scanf("%d",&park[x].parkNo);

    park[x].availability = 1;

    counter++;

  }
}
此外,当用户输入为-1时,您还有一个问题。当前代码只是继续并在索引-1处添加了一个元素。那是违法的

要修复此问题,请在
scanf
之后添加一行。比如:

    scanf("%d", &x);
    if (x == -1) break;  // Stop the while loop
if (scanf("%d", &x) != 1)
{
    // Invalid input"
    ... error handling ...
}
通过该更改,您可以执行
while(1)
而不是
while(x!=-1)

一些额外的评论:

int main()
{   
  int c = 0;
  int x;                      // UPS: x is uninitialized
  struct Vehichle vehicle[c]; // UPS: c is zero so you don't get an array
  struct Parking park[50];


  int counter = 1; 
  while(x!=-1)                // UPS: Use of uninitialized x
  {
    printf("Enter -1 to end: \n");
    scanf("%d", &x);
    printf("Enter Vehicle Type etc: suv,mpv and more:");
    scanf("%d",&vehicle[x].vecType);             // UPS: vecType is char array so
                                                 // use %s instead of %d
                                                 // and don't use a &
    printf("Please enter parking Number :");
    scanf("%d",&park[x].parkNo);

    park[x].availability = 1;

    counter++;

  }
}
您应该检查用户输入(aka
x
)是否在用作数组索引的有效范围内

您还应该检查
scanf
的返回值。比如:

    scanf("%d", &x);
    if (x == -1) break;  // Stop the while loop
if (scanf("%d", &x) != 1)
{
    // Invalid input"
    ... error handling ...
}
(1) 下面是一个更新的代码,因为您的代码有几个问题。 我相信,看看下面的代码,您将能够理解代码中的错误。 您可以随意使用它作为编写自己版本的基础。 (2) 请仔细阅读内联评论。这些评论是经过深思熟虑的 解释该部分代码的意图 (3) 这只是一个快速代码。我还没有编译/运行/测试这段代码。 我的目的只是想用一个可能的例子给大家一个想法

/*一个非常基本的停车管理模块

当车辆进入停车场时 a) 捕获车辆信息和停车场号(位于其停车位置) b) 将该地段标记为不可用

当车辆离开停车场时, 捕获正在清空的停车场编号, 并将该批次标记为可用

还有,在路上玩得开心点。 */

#包括
#定义你被大的坏的可怕的怪物困住了(“哈哈哈,你没有阅读并遵循内联评论!!\n现在站起来,跳3次,然后坐下来,再次阅读所有评论,并进行最小代码修改以使我离开,否则我不会让你逃离停车场…呼哈哈哈>-)\n”);updateVehicleParkingInfo=1;})
#包括
结构车辆{
char vecType[100];//车辆类型,如suv、mpv等。。。
字符车牌号[10];//车辆的车牌号
浮动小时数;/???
};
结构停车场{
int parkNo;//停车场编号
bool可用性;//tbis停车位可用吗?是/否
};
结构车辆标记信息{
结构车辆;//车辆信息
struct Parking Parking;//对应的停车信息
};
//停车位拥有的最大停车场数量
#定义最大停车位10
//停车场可用旗帜
#定义停车场是否可用真
#定义停车场不可用错误
//车辆进出标志
#定义车辆输入为真
#定义车辆离开false
void main(){
int updateHicleparkinInfo;//表示用户希望更新停车信息的标志。
int vehicleddirection;//用于指示车辆是进入停车场还是离开停车场的标志
int parkingIdx;//要从中获取值的停车场索引。
//所有停车场信息的数组
结构车辆停车信息车辆停车信息[最大停车位];
//将所有停车场的停车和车辆信息初始化为零
memset(车辆停车信息,0,最大停车场*尺寸(车辆停车信息));
//对于每个停车场,将其标记为可用,并连续分配停车场编号
对于(parkingIdx=0;parkingIdx<最大停车位;parkingIdx++){
车辆停车信息[parkingIdx].parking.parkino=parkingIdx;
车辆停车信息[parkingIdx].parking.availability=停车场可用;
}
//如果需要更新停车信息或是关门回家的时间,请获取用户输入
printf(“更新停车信息?输入0结束”);
scanf(“%d”和更新HicleparkingInfo);
/*
****哨兵环****
继续更新停车信息,直到用户想要更新的次数不限。
仅当用户输入特定值(即0)时停止。
*/
while(updateHicleparkingInfo!=0){
printf(“车辆方向?1表示进入,0表示离开:”);
scanf(“%d”和车辆方向);
如果(车辆方向==车辆进入){
做{
printf(“请输入停车编号:”);
scanf(“%d”和parkingIdx);
//***崩溃警报!!!***如果parkingIdx小于0或>=最大停车位,以下代码可能崩溃
//TODO:(1)添加停车的安全检查IDX(2)如果安全检查失败,添加纠正步骤
//如果停车不可用,请打印错误消息
if(车辆停车信息[parkingIdx].parking.availability==停车场\停车场\不可用){
//TODO:将下面的信息更改为微调乐趣、幽默、戏弄等级别(还记得星际旅行中焦油的幽默设置吗?)
printf(“此停车场还有其他车辆停放,请输入其他停车场编号\n”);
printf(“顺便说一句,我知道哪些批次是可用的,但我不会告诉你…呵呵>-)\n,继续尝试…呵呵呵呵\n”);
}
//检查请求的停车场是否可用