鱼C论坛

 找回密码
 立即注册
查看: 537|回复: 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 函数来比较两个字符串的内容。所以,你的代码中的这一行:

  
  1.    if(a->Bookauthor==im||a->Bookname==im)
  2.    
复制代码

   应该修改为:
  
  1.    if(strcmp(a->Bookauthor, im) == 0 || strcmp(a->Bookname, im) == 0)
  2.    
复制代码


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

  
  1.    a->library =(struct Library *)malloc (sizeof(struct Library *));
  2.    library=(struct Library *)malloc (sizeof(struct Library *));
  3.    
复制代码

   应该修改为:
  
  1.    a->library =(struct Library *)malloc (sizeof(struct Library));
  2.    library=(struct Library *)malloc (sizeof(struct Library));
  3.    
复制代码


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 函数来比较两个字符串的内容。所以,你的代码中的这一行:

  
  1.    if(a->Bookauthor==im||a->Bookname==im)
  2.    
复制代码

   应该修改为:
  
  1.    if(strcmp(a->Bookauthor, im) == 0 || strcmp(a->Bookname, im) == 0)
  2.    
复制代码


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

  
  1.    a->library =(struct Library *)malloc (sizeof(struct Library *));
  2.    library=(struct Library *)malloc (sizeof(struct Library *));
  3.    
复制代码

   应该修改为:
  
  1.    a->library =(struct Library *)malloc (sizeof(struct Library));
  2.    library=(struct Library *)malloc (sizeof(struct Library));
  3.    
复制代码


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 ;,多余的空格会导致编译错误。


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

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

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

  9. struct Library
  10. {
  11.         char Bookname[20];
  12.         char Bookauthor[20];
  13.         struct Library *library;
  14. };

  15. void input(struct Library *m)
  16. {
  17.     char a;
  18.     printf("是否加入书籍(Y/N):");
  19.     scanf("%c",&a);
  20.     getchar();
  21.     if(a=='Y')
  22.     {
  23.         spent(m);
  24.         printf("请输入书名:");
  25.         scanf("%s",m->Bookname);
  26.         getchar();
  27.         printf("请输入作者:");
  28.         scanf("%s",m->Bookauthor ) ;
  29.         getchar();
  30.         input(m->library );
  31.     }
  32.     else
  33.     {
  34.         return ;
  35.     }
  36. }

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

  43. void Lookfor(struct Library *a, char im[20])
  44. {
  45.     if(a!=NULL)
  46.     {
  47.         if(strcmp(a->Bookauthor,im)==0 || strcmp(a->Bookname,im)==0)
  48.         {
  49.             printf("已检索,你要搜的书的作者为%s,书名为%s\n",a->Bookauthor,a->Bookname);
  50.             return Lookfor(a->library, im);
  51.         }
  52.         else
  53.         {
  54.             Lookfor(a->library, im);
  55.         }
  56.     }
  57.     else
  58.     {
  59.         printf("抱歉,无此书");
  60.         return ;
  61.     }
  62. }

  63. void spent(struct Library *a)
  64. {
  65.     a->library =(struct Library *)malloc (sizeof(struct Library));
  66. }

  67. int main(void)
  68. {
  69.     struct Library *library=NULL;
  70.     library=(struct Library *)malloc (sizeof(struct Library));
  71.     input(library);
  72.     char im[20];
  73.     key(im);
  74.     Lookfor(library, im);
  75.     return 0;
  76. }
复制代码

希望这些修改能够帮助你完善你的程序,让它更加完善和健壮。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 23:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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