【发布时间】:2021-08-17 10:30:27
【问题描述】:
我正在尝试创建一个汽车租赁项目。我在函数createCarList() 中创建了一个链表,其中struct car 在f.h 中定义。
当我进入一辆车时,一切正常。当我输入两辆车时,我总是会出现无限循环,例如使用printAllCars() 打印列表时,或者如果我尝试检查该车是否已经在列表中。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<String.h>
#include<ctype.h>
/*car struct */
typedef struct car{
unsigned int plate_number;
unsigned int vin_number;
char *Manufacturer_Name;
char *model;
char *colour;
unsigned int year_Manufactured;
unsigned int realseYear;
unsigned int payment;
unsigned int value;
unsigned int engine_power;
struct car *next;
}car;
car *cars;
/*function to scan and check the int input*/
int CheckIntinput(unsigned int *a)
{
char temp[20];
int i;
int flag=1;
while(1)
{
scanf("%s",temp);
for(i=0;i<strlen(temp);i++)
{
if(!isdigit(temp[i]))
{
flag=0;
printf("You did not enter a number , Please enter an argument's number\n");
break;
}
}
if(flag)
{
break;
}
flag=1;
}
*a=strtoul(temp,NULL,10);
return 1;
}
/*function to check if the information of the car are correct*/
void checkifcarnputiscorrect(unsigned int *plate_number,unsigned int *vin_number,unsigned int *year_Manufactured,unsigned int *realseYear
,unsigned int *payment,unsigned int *value,unsigned int *engine_power){
int flag=1;
while(1)
{
printf("enter plate number :");
CheckIntinput(plate_number);
if(*plate_number>9999999 || *plate_number<1000000)
{
printf("plate number should be 7 digits try again \n");
flag=0;
}
/*
if(!checkifcaralreadyinlist(*plate_number))
{
printf("the car is already in the list \n");
flag=0;
}*/
if(flag){break;}
flag=1;
}
while(1)
{
printf("enter vin number :");
CheckIntinput(vin_number);
if(*vin_number>99999 || *vin_number<10000)
{
printf("vin_number should be 5 digits try again\n");
flag=0;
}
if(flag){break;}
flag=1;
}
while(1)
{
printf("enter year manfucatured :");
CheckIntinput(year_Manufactured);
if(*year_Manufactured>9999||*year_Manufactured<1000)
{
printf("yeaer_manfucatured should be 4 digits try again\n");
flag=0;
}
if(flag){break;}
flag=1;
}
while(1)
{
printf("enter realese year :");
CheckIntinput(realseYear);
if(*realseYear>9999||*realseYear<1000){
printf("realse year should be 4 digits try again \n");
flag=0;
}
if(flag){break;}
flag=1;
}
while(1){
printf("enter payment :");
CheckIntinput(payment);
if(*payment>9999999||*payment<0){
printf("payment should be between 0-9999999 digits\n");
flag=0;
}
if(flag){break;}
flag=1;
}
while(1){
printf("enter value :");
CheckIntinput(value);
if(*value>9999999||*value<0){
printf("value should be between 0-9999999 digits\n");
flag=0;
}
if(flag){break;}
flag=1;
}
while(1){
printf("enter engine_power :");
CheckIntinput(engine_power);
if(*engine_power>9999||*engine_power<1000){
printf("engine power be 4 digits\n");
flag=0;
}
if(flag){break;}
flag=1;
}
}
/*function to scan and check if the input is only chars*/
void Checkstringifonlychars(char *str){
int i;
int flag=1;
while(1)
{
scanf("%s",str);
for(i=0;i<strlen(str);i++)
{
if(!isalpha(str[i]))
{
flag=0;
printf("wrong input try input only chars.");
break;
}
}
if(flag)
{
break;
}
flag=1;
}
}
int CheckLonginput(unsigned long *a)
{
char temp[20];
int i;
int flag=1;
while(1)
{
scanf("%s",temp);
for(i=0;i<strlen(temp);i++)
{
if(!isdigit(temp[i]))
{
flag=0;
printf("You did not enter a number , Please enter an argument's number\n");
break;
}
}
if(flag)
{
break;
}
flag=1;
}
*a=strtoul(temp,NULL,10);
return 1;
}
/*creating empty car list */
int createCarList()
{
car *cars=(car*)malloc(sizeof(car));
if(!cars)
{
return 0;
}
cars->next=NULL;
return 1;
}
int addNewCar()
{
unsigned int plate_number,vin_number,realseYear,year_Manufactured,payment,value,engine_power;
char *Manufacturer_Name,*model,*colour,c;
car * temp=NULL;
car * p=NULL;
temp=NULL;
temp=(car*)malloc(sizeof(car));
while(1){
checkifcarnputiscorrect(&plate_number,&vin_number,&year_Manufactured,&realseYear,&payment,&value,&engine_power);
Manufacturer_Name=(char*)malloc(5 * sizeof(char));
printf("enter Manufacturer Name:");
Checkstringifonlychars(Manufacturer_Name);
model=(char*)malloc(5 * sizeof(char));
printf("enter model:");
Checkstringifonlychars(Manufacturer_Name);
colour=(char*)malloc(5 * sizeof(char));
printf("enter colour of the car:");
Checkstringifonlychars(Manufacturer_Name);
temp->plate_number=plate_number;
temp->vin_number=vin_number;
strcpy(temp->Manufacturer_Name,Manufacturer_Name);
strcpy(temp->model,model);
strcpy(temp->colour,colour);
temp->year_Manufactured=year_Manufactured;
temp->realseYear=realseYear;
temp->payment=payment;
temp->value=value;
temp->engine_power=engine_power;
temp->next=NULL;
if(cars==NULL)
{
cars=temp;
}
else
{
p=cars;
while(p->next!=NULL)
{
p=p->next;
}
p->next=temp;
}
printf("\n done adding? if yes press y ");
scanf(" %c",&c);
if(c=='y')
{
break;
}
}
if(cars==NULL)
{
return 0;
}
return 1;
}
void printAllCars(void){
car *tmp=cars;
if(!cars){
printf("No Cars in list to Shown\n");
return;
}
printf("\nCar List :\n\n");
printf("LicenseNum | chassisNum | makerName | modelName | color | productionYear | onRoadYear | price | paidMoney | engine");
printf("\n----------------------------------------------------------------------------------------------------------------------\n");
while(tmp!=NULL)
{
printf("%-11u ",tmp->plate_number);
printf("%-13u ",tmp->vin_number);
printf("%-11s ",tmp->Manufacturer_Name);
printf("%-11s ",tmp->model);
printf("%-7s ",tmp->colour);
printf("%-16u ",tmp->year_Manufactured);
printf("%-11u ",tmp->realseYear);
printf("%-9u ",tmp->value);
printf("%-14u ",tmp->payment);
printf("%u\n",tmp->engine_power);
tmp=tmp->next;
}
printf("\n");
}
int main()
{
createCarList();
addNewCar();
printAllCars();
return 0;
}
输入:
enter plate number :1234567
enter vin number :12345
enter year manfucatured :1994
enter realese year :1995
enter payment :30000
enter value :25000
enter engine_power :3000
enter Manufacturer Name:bmw
enter model:bmw
enter colour of the car:red
输出:
plate number :1234567
vin number :12345
year manfucatured :1994
realese year :1995
enter payment :30000
enter value :25000
engine_power :3000
Manufacturer Name:bmw
model:bmw
colour of the car:red
当我添加第二辆车或更多时。
enter plate number :1234567
enter vin number :12345
enter year manfucatured :1994
enter realese year :1995
enter payment :30000
enter value :25000
enter engine_power :3000
enter Manufacturer Name:bmw
enter model:bmw
enter colour of the car:red
输出: 打印第一辆车然后无限时间第二辆车。
我检查了所有函数的while 循环,但找不到错误。可能是什么问题?
【问题讨论】:
-
createCarList 创建一个局部变量cars,返回时会丢失
-
... 这让我怀疑提供的代码不能代表真正的问题。
-
请提供问题的minimal reproducible example 准确输入、预期输出和实际输出。
-
car * temp=NULL; temp=NULL; temp=(car*)malloc(sizeof(car));中间没有阅读?你为什么不只是有car* temp = (car*)malloc(sizeof(car)); -
如果我从输入中获得 1 辆汽车,它可以使用输入中的特定详细信息打印汽车,我在这里没有写的所有功能都可以正常工作,但是当我输入 2 辆以上汽车时存在问题,它在开始打印时进入无限循环,并且不会停止
标签: c linked-list