如何用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++;
}
}
您应该检查用户输入(akax
)是否在用作数组索引的有效范围内
您还应该检查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”);
}
//检查请求的停车场是否可用