叶落了 发表于 2023-6-8 22:54:09

为什么中间的if不运行

#include<stdio.h>
#include<stdlib.h>

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


struct Library
{
        char Bookname;
        char Bookauthor;
        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;
void key(char im)
{
        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;
}

isdkz 发表于 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 。

希望这些信息能帮到你!

歌者文明清理员 发表于 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);
void input(struct Library *m);
void Lookfor(struct Library *a, char im);

struct Library
{
      char Bookname;
      char Bookauthor;
      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)
{
    printf("请输入你要找的书的书名或者作者:");
    scanf("%s",im);
    getchar();
}

void Lookfor(struct Library *a, char im)
{
    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;
    key(im);
    Lookfor(library, im);
    return 0;
}
希望这些修改能够帮助你完善你的程序,让它更加完善和健壮。
页: [1]
查看完整版本: 为什么中间的if不运行