ifelse中调用的函数不执行


#include<stdio.h>
#include<math.h>
#include<string.h>
#define max 30
#include<stdlib.h>
typedef struct flight
{
    char station[max];
    int num;
    char time[max];
    int ticketnum;//余票 
}ft;
typedef struct userdata {
    char user_username[20];
    char user_password[8];
    int  ticket;
    int airnum;
}userinfo;
userinfo userin[max];
ft f[max];
int n;//航班号 
int i;//航班数
int usernum;
int m;
int flightnum;
void listrest()//列出余票 
{
    printf("请选择查找方式\n");
    printf("1.按航班号查找\n");
    printf("2.按终点站查找\n");
    int way2,z;
    scanf("%d",&way2);
    if(way2==1)
    {    /*1.输入航班号查找航班信息并输出*/
printf("请输入要查找的航班号:");
scanf("%d",&n);//printf("%d",);
/*for(m=0;m<i+1;m++){
        printf("%d\n",f[m].num);
        if(n==f[m].num)
          { 
          z= 1;  //printf("%d",z);
            break;}     //若查找成功
    }*/
    judgen(n,z);
if(z==0){
    printf("未查找到该航班号信息!");
}
else if(judgen(n)==0){
//    printf("z%d  i%d",z,i);
system("cls");
printf("\n航班号:%d\n",f[m].num);
printf("\n----------------查找到的航班信息--------------\n\n");
printf("余票%d",f[i].ticketnum);
                      //输出查找结果
}
else
printf("输入错误");
}
else if(way2==2)/*2.按终点站查找航班的函数*/
{
    printf("请输入终点站");
    char sta1[max];
    scanf("%s",&sta1);
    for(m=0;m<i;m++){
        if(sta1==f[i].station)
           z= 1;   break;     //若查找成功
    }
judges(n,z);
if(z==0){
    printf("未查找到该航班号信息!");printf("%d\n",i);
}
else if(z==1)
{
    system("cls");
printf("\n航班号:%d\n",n);
printf("\n----------------查找到的航班信息--------------\n\n");
printf("余票%d",f[i].ticketnum);
}
}
else
{
    printf("输入错误"); 
}
}
void printall()//1列出所有航班 
{
    //打开文件
    //打开文件
FILE *pfile = fopen("flight.txt", "rb");
    if (pfile == NULL) {
        printf("open file failed!\n");
        exit(0);
    }

    //读取文件长度,读完后把文件指针复位到开头
    fseek(pfile,0, SEEK_END);
    int file_length = ftell(pfile);
    rewind(pfile);

    //申请一段内存空间用来放文件中的文本内容,并置零
    int text_length = file_length * sizeof(char) + 1;
    char * text_buffer = (char*)malloc(text_length);
//    memset(text_buffer, 0, text_length);

    //把文件文本内容读到申请的内存空间中
 fread(text_buffer, 1, file_length, pfile);
    /*if (read_length != file_length) {
        printf("read file failed!\n");
        exit(0);
    }*/

    //打印文件文本内容,释放申请的内存空间,关闭文件流
    printf(" 终点站   余票   航班号  起飞时间\n"); 
    printf(text_buffer);
    free(text_buffer);
    fclose(pfile);
}
judgen(n,x)
{
    for(m=0;m<i;m++)
    {
        if(n==f[m].num)
        {
            break;
        }
     } 
     if(i==m)
     {
         printf("error");
         x=0;
     }
     else
     printf("ok");
     x=1;
}

订票与退票函数


void book()//订票 
{
    int booknum,y=0;
    printf("请输入要预定的航班号");
    scanf("%d",&n);
    printf("请输入预定的票数");
    scanf("%d",&booknum);
    for(m=0;m<i;m++){
        if(n==f[m].num)
         {  y= 1;   break;}     //若查找成功
    }
    printf("%d",y);
    if(y==1)
    {
        if(booknum<f[m].ticketnum)
        {
        printf("订票成功!");
        f[i].ticketnum=f[i].ticketnum-booknum;
        userin[i].ticket=booknum;
        }
        else
        printf("余票不足");
    }
    else if(y==0)
    {
        printf("输入错误!");
    }
    else
    {
        printf("输入错误!");
    }
}
void delay()//退票
{
    int delaynum,m=0;
    printf("请输入要退票的航班号");
    scanf("%d",&n);
    printf("请输入退票的票数");
    scanf("%d",&delaynum);
    for(m=0;m<i;m++){
        if(n==f[m].num && userin[usernum].ticket!=0 ){
           m= 1;  
           break;    
        } //若查找成功
    }
    if(m==1)
    {
    f[i].ticketnum=    f[i].ticketnum+delaynum;
    }
    else if(m==0)
    {
        printf("输入错误!");
    }
    else
    {
        printf("输入错误!");
    }

函数打印用户的订票信息

void printuserinfo()
{
    if(userin[usernum].ticket!=0){
    printf("预定的航班号%d\n",userin[usernum].airnum);
    printf("预定票数%d\n",userin[usernum].ticket);
    }
    else
    {
        printf("您没有预定航班");
    }

}


下面是后台管理人员的函数

void writein()
{
    FILE *fp = fopen("flight.txt", "w");
    if (fp == NULL) {
        printf("open file failed!\n");
        exit(0);
    }
    int a;
    printf("请输入需录入的航班数: ");
    scanf("%d", &i);
    getchar();
    printf("请输入第%d个航班的信息",i);
    for(a=0;a<i;a++)
    {
        printf("请输入终点站\n");
        scanf("%s",f[a].station);
        getchar();
        printf("请输入票数\n");
        scanf("%d",&f[a].ticketnum);
        printf("请输入航班号\n");
        scanf("%d",&f[a].num);
        printf("请输入起飞时间\n");
        scanf("%s",f[a].time);
        getchar();
        fprintf(fp,"%s %d  %d %s\n", f[a].station,f[a].ticketnum,f[a].num,f[a].time);
  }
  fclose(fp);
}

void revise()
{
    FILE *fp = fopen("flight.txt", "w");
    if (fp == NULL) {
        printf("open file failed!\n");
        exit(0);
    }
    printf("请输入要修改的航班号");
    scanf("%d",n);
judgen(n,x);
if(x==0)
{
    printf("error");
 } 
 else if(x==1)
 {
      printf("请输入终点站\n");
        scanf("%s",f[a].station);
        getchar();
        printf("请输入票数\n");
        scanf("%d",&f[a].ticketnum);
        printf("请输入航班号\n");
        scanf("%d",&f[a].num);
        printf("请输入起飞时间\n");
        scanf("%s",f[a].time);
        getchar();
        fprintf(fp,"%s %d  %d %s\n", f[m].station,f[m].ticketnum,f[m].num,f[m].time);
     
 }
 fclose(fp);
}

下面是main函数

if(strcmp(u->user_username,adminer)!=0)//判断是否是后台人员
    {
        usermenu();    
        int choice1;
        scanf("%d",choice1);
        if(choice1==1)
        {
        printall();
        }
        else if(choice1==2)
        {
        listrest();
        }
        else if(choice1==3)
        {
        
        }
    }
    else
    {
    adminmenu();
    int choice2;
    scanf("%d",choice2);
    if(choice2==1)
    {
      printall();
    }
    else if(choice2==2)
    {
        writein();
    }
    else if(choice2==3)
    {
        
    }
}

以上函数可以单独在main中运行,但如果放在ifelse中就不能运行,在judge中无论怎么样都找不到航班信息

竟然可以运行 我觉得你这个代码的问题有点大,刚刚我就看了一下你写的void listrest()//列出余票,这个函数,在第二个else if语句中你定义了一个字符数组char sta1[max]; 然后你竟然这么写:scanf("%s",&sta1); 首先,这边如果是要输入一整个字符串,最好是用gets,如果是你非要用scanf,也不应该&啊,这是一个数组,sta1本身就是数组首元素的地址,是不应该使用&操作符的,然后,你写的这个if (sta1 == f[i].station),我也不懂你是想表达什么,剩下的问题我再慢慢看,你自己先把这个修改一下

检查下listrest函数,里面的if else的逻辑和格式看下,应该逻辑上有问题!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    如果将订票与退票函数放在ifelse语句中进行调用,这些函数不会受到影响而无法执行,前提是ifelse语句的判断条件正常执行并返回true或false。只有when语句(switch case语句)中,如果没有处理所有的情况,而且没有default(默认)情况,才会导致函数无法执行。

    在后台管理人员的函数中,如果有打印用户订票信息的部分,应该是跟订票或退票函数的执行结果有关联的打印信息,比如打印成功或失败信息、打印订单号等。如果这个打印信息没有异常,也不会影响订票或退票函数的执行。

    为了更好地理解问题,需要了解具体的业务逻辑和代码结构。一般来说,如果将订票与退票函数放在ifelse语句中进行调用,应该是在判断条件成立的情况下才会执行相应的操作,而判断不成立则不执行。代码执行过程应该是先判断ifelse语句的条件,如果条件成立,则执行订票或退票函数;如果条件不成立,则不执行。

    在执行过程中可能遇到的问题包括但不限于:1)ifelse语句的条件判断不准确,导致函数执行与预期不符;2)订票或退票函数本身存在问题,导致函数执行失败;3)打印用户信息的部分存在错误,导致用户无法正确获取订单信息等。为了解决这些问题,需要仔细检查代码逻辑和细节,并逐步调试和修复可能出现的问题。

    下面是一个示例代码,演示了将订票与退票函数放在ifelse语句中进行调用的情况:

    # 定义订票函数
    def book_ticket(name):
        # some code here to book ticket
        print("订票成功!")
    
    # 定义退票函数
    def refund_ticket(name):
        # some code here to refund ticket
        print("退票成功!")
    
    # 定义判断条件
    is_book = True
    user_name = "Lucy"
    
    # 判断条件,执行相应函数
    if is_book:
        book_ticket(user_name)
    else:
        refund_ticket(user_name)
    

    在这个示例中,如果is_book为True,则会执行book_ticket函数,并输出“订票成功!”;如果is_book为False,则会执行refund_ticket函数,并输出“退票成功!”


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

估计是main函数里的scanf函数用法错误,scanf里面应该取变量地址

img