鱼C论坛

 找回密码
 立即注册
查看: 728|回复: 2

[已解决]为什么中间的if不运行

[复制链接]
发表于 2023-6-8 22:54:09 | 显示全部楼层 |阅读模式
4鱼币
#include<stdio.h>
#include<stdlib.h>

//函数声明
void spent(struct Library *a);
void key(void);
void input(struct Library *m);


struct Library
{
        char Bookname[20];
        char Bookauthor[20];
        struct Library *library;
};

char a;
void input(struct Library *m)
{
                printf("是否加入书籍(Y/N):");
            scanf("%c",&a);
            if(a=='Y')
            {
                    spent(m);
                    printf("请输入书名:");
                    scanf("%s",m->Bookname);
                    getchar();
                        printf("请输入作者:");
                        scanf("%s",m->Bookauthor ) ;
                        getchar();
                        input(m->library );
                }
                else
                {
                        return ;
                }
}

//我不想浪费内存
//搜索条件
char im[20];
void key(char im[20])
{
        printf("请输入你要找的书的书名或者作者:");
        scanf("%s",im);
        getchar();
        return ;
}

//开始查找
void Lookfor(struct Library *a)
{
        printf("1\n");
        printf("%s\n",a->Bookauthor);
        printf("%s\n",a->Bookname);
        printf("%s\n",im);
        if(a!=NULL)
        {
                //不运行
                if(a->Bookauthor==im||a->Bookname==im)
                {
                                printf("已检索,你要搜的书的作者为%s,书名为%s\n",a->Bookauthor,a->Bookname);
                                Lookfor(a->library );
                }
                printf("11");
               
        }
        else
        {
                printf("抱歉,无此书");
                return ;
        }
}

//分配内存
void spent(struct Library *a)
{
        a->library =(struct Library *)malloc (sizeof(struct Library *));
}


int main(void)
{
        struct Library *library=NULL;
        library=(struct Library *)malloc (sizeof(struct Library *));
        //这里之前出bug了//struct Library *(malloc sizeof(struct Library *));
       
        input(library);
        key(im);
        Lookfor(library);
       
        return 0;
}
最佳答案
2023-6-8 22:54:10
你的代码中有几个问题,尤其是在字符串比较和内存分配上。

1. 在C中,你不能直接用 == 来比较两个字符串,因为这样实际上是在比较两个字符串的内存地址,而不是它们的内容。你应该使用 strcmp 函数来比较两个字符串的内容。所以,你的代码中的这一行:

   if(a->Bookauthor==im||a->Bookname==im)
   
   应该修改为:
   if(strcmp(a->Bookauthor, im) == 0 || strcmp(a->Bookname, im) == 0)
   

2. 在C中,当你要分配内存给结构体的时候,你应该使用 sizeof(struct Library) ,而不是 sizeof(struct Library *) 。因为 sizeof(struct Library *) 只会分配一个指针的大小,而不是整个结构体的大小。所以,你的代码中的这一行:

   a->library =(struct Library *)malloc (sizeof(struct Library *));
   library=(struct Library *)malloc (sizeof(struct Library *));
   
   应该修改为:
   a->library =(struct Library *)malloc (sizeof(struct Library));
   library=(struct Library *)malloc (sizeof(struct Library));
   

3. 在你的 input 函数中,你递归地调用了 input(m->library) ,但是你并没有为 m->library 分配任何内存。在你调用 input(m->library) 之前,你需要确保为 m->library 分配了内存。

4. 注意在你的 Lookfor 函数中,你先打印了 a->Bookauthor , a->Bookname ,然后检查了 a 是否为 NULL 。这可能会导致当 a 为 NULL 时程序崩溃。你应该先检查 a 是否为 NULL ,然后再打印 a->Bookauthor 和 a->Bookname 。

希望这些信息能帮到你!

最佳答案

查看完整内容

你的代码中有几个问题,尤其是在字符串比较和内存分配上。 1. 在C中,你不能直接用 == 来比较两个字符串,因为这样实际上是在比较两个字符串的内存地址,而不是它们的内容。你应该使用 strcmp 函数来比较两个字符串的内容。所以,你的代码中的这一行: 应该修改为: 2. 在C中,当你要分配内存给结构体的时候,你应该使用 sizeof(struct Library) ,而不是 sizeof(struct Library *) 。因为 sizeof(struct L ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-8 22:54:10 | 显示全部楼层    本楼为最佳答案   
你的代码中有几个问题,尤其是在字符串比较和内存分配上。

1. 在C中,你不能直接用 == 来比较两个字符串,因为这样实际上是在比较两个字符串的内存地址,而不是它们的内容。你应该使用 strcmp 函数来比较两个字符串的内容。所以,你的代码中的这一行:

   if(a->Bookauthor==im||a->Bookname==im)
   
   应该修改为:
   if(strcmp(a->Bookauthor, im) == 0 || strcmp(a->Bookname, im) == 0)
   

2. 在C中,当你要分配内存给结构体的时候,你应该使用 sizeof(struct Library) ,而不是 sizeof(struct Library *) 。因为 sizeof(struct Library *) 只会分配一个指针的大小,而不是整个结构体的大小。所以,你的代码中的这一行:

   a->library =(struct Library *)malloc (sizeof(struct Library *));
   library=(struct Library *)malloc (sizeof(struct Library *));
   
   应该修改为:
   a->library =(struct Library *)malloc (sizeof(struct Library));
   library=(struct Library *)malloc (sizeof(struct Library));
   

3. 在你的 input 函数中,你递归地调用了 input(m->library) ,但是你并没有为 m->library 分配任何内存。在你调用 input(m->library) 之前,你需要确保为 m->library 分配了内存。

4. 注意在你的 Lookfor 函数中,你先打印了 a->Bookauthor , a->Bookname ,然后检查了 a 是否为 NULL 。这可能会导致当 a 为 NULL 时程序崩溃。你应该先检查 a 是否为 NULL ,然后再打印 a->Bookauthor 和 a->Bookname 。

希望这些信息能帮到你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-8 22:56:18 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-6-8 22:59 编辑

这是一段C语言的代码,实现了一个简单的图书管理系统。不过其中有些问题需要注意:

  • 在函数spent(struct Library *a)中,为每个新节点分配内存时应该使用malloc(sizeof(struct Library))而不是malloc(sizeof(struct Library *))。因为要分配整个struct Library结构体的大小,而不是指向struct Library的指针的大小。
  • 在函数input(struct Library *m)中,读入字符时需要使用getchar()来消耗掉输入缓冲区中的回车符,否则会对后面的读入造成影响。
  • 在函数Lookfor(struct Library *a)中,搜索条件im应该作为参数传入函数中,而不是定义为全局变量。全局变量容易造成同名变量混淆以及出现意想不到的错误。
  • 函数Lookfor(struct Library *a)中的条件语句判断字符串相等时应该使用strcmp()函数,而不是用==运算符。因为==只能比较两个指针的值是否相等,而无法比较指针指向的字符串是否相同。
  • 在函数Lookfor(struct Library *a)中,在检索到目标结果后应该添加跳出函数的语句,否则会继续查找,导致重复输出结果。
  • 在函数input(struct Library *m)中,若用户选择退出,返回值应该是return;而不是return ;,多余的空格会导致编译错误。


以上是我对这段代码的一些建议和指导,希望对你有帮助。以下是帮你修改后的代码,已经解决了之前提到的问题:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//函数声明
void spent(struct Library *a);
void key(char im[20]);
void input(struct Library *m);
void Lookfor(struct Library *a, char im[20]);

struct Library
{
        char Bookname[20];
        char Bookauthor[20];
        struct Library *library;
};

void input(struct Library *m)
{
    char a;
    printf("是否加入书籍(Y/N):");
    scanf("%c",&a);
    getchar();
    if(a=='Y')
    {
        spent(m);
        printf("请输入书名:");
        scanf("%s",m->Bookname);
        getchar();
        printf("请输入作者:");
        scanf("%s",m->Bookauthor ) ;
        getchar();
        input(m->library );
    }
    else
    {
        return ;
    }
}

void key(char im[20])
{
    printf("请输入你要找的书的书名或者作者:");
    scanf("%s",im);
    getchar();
}

void Lookfor(struct Library *a, char im[20])
{
    if(a!=NULL)
    {
        if(strcmp(a->Bookauthor,im)==0 || strcmp(a->Bookname,im)==0)
        {
            printf("已检索,你要搜的书的作者为%s,书名为%s\n",a->Bookauthor,a->Bookname);
            return Lookfor(a->library, im);
        }
        else
        {
            Lookfor(a->library, im);
        }
    }
    else
    {
        printf("抱歉,无此书");
        return ;
    }
}

void spent(struct Library *a)
{
    a->library =(struct Library *)malloc (sizeof(struct Library));
}

int main(void)
{
    struct Library *library=NULL;
    library=(struct Library *)malloc (sizeof(struct Library));
    input(library);
    char im[20];
    key(im);
    Lookfor(library, im);
    return 0;
}
希望这些修改能够帮助你完善你的程序,让它更加完善和健壮。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 05:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表