鱼C论坛

 找回密码
 立即注册
查看: 1153|回复: 7

[已解决]动态内存结构体图书馆

[复制链接]
发表于 2020-9-26 21:52:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

main()
{
        struct Library {
                char name[30];
                char author[10];
                long int date;

};
        int i;
        struct  Library *book = NULL;
        int m=1;
        while (1)
        {
               
               
                book= (struct Library*)realloc(book, m * sizeof(struct Library));
                printf("please input %d name of book(iput -1 exit):", m);
                scanf_s("%s",&((book+m-1)->name));
                printf("please input %d author of book:", m);
                scanf_s("%s", &((book + m - 1)->author));
                printf("please input %d date of book:", m);
                scanf_s("%ld", &((book + m - 1)->date));
                if(*((book+m-1)->name)==-1)
                {
                        break;
                }
                m++;
               

        }

       
        for (i = 0; i < m-1; i++)
        {

                printf("%s\n", (book + i)->name);
                printf("%s\n", (book + i)->author);
                printf("%ld\n", (book + i)->date);
        }

}








好像写入和打印有问题,求大佬DEBUG
最佳答案
2020-9-27 08:03:21
汽车行业工程师 发表于 2020-9-26 23:28
0x0F72E63C (ucrtbased.dll)处(位于 Project2.exe 中)引发的异常: 0xC0000005: 写入位置 0x009DE000 时发 ...

改成scanf_s(),不行了?
再后面添加指定长度scanf_s("%s",((book+m-1)->name),40),同理,后面那个加个10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-26 22:11:39 | 显示全部楼层
我的编译器不支持scanf_s,你手动改一下
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. // 结构体以后最好定义在函数外 ,你的也没影响,不过影响 用户阅读
  4. struct Library
  5. {
  6.             char name[30];
  7.             char author[10];
  8.             long int date;

  9. };

  10. int main(void)
  11. {
  12.         
  13.         int i;
  14.         struct  Library *book = NULL;
  15.         int m=1;
  16.         while (1)
  17.         {
  18.                
  19.                
  20.                 book= (struct Library*)realloc(book, m * sizeof(struct Library));
  21.                 printf("please input %d name of book(iput -1 exit):", m);
  22.                 scanf("%s",((book+m-1)->name)); // 输入的是字符串,不需要加&
  23.                
  24.                 // 判断语句写到这里比较好,避免用户想退出时还要再输两个值
  25.                 if(strcmp(((book+m-1)->name), "-1") == 0) // 两个字符串比较,而不是字符与整型常量
  26.                 {
  27.                         break;
  28.                 }
  29.                
  30.                 printf("please input %d author of book:", m);
  31.                 scanf("%s", ((book + m - 1)->author)); // 同上
  32.                 printf("please input %d date of book:", m);
  33.                 scanf("%ld", &((book + m - 1)->date));
  34.                
  35.                 m++;
  36.                /* if(((book+m-1)->name)=="-1")
  37.                 {
  38.                         break;
  39.                 }
  40.                 m++;
  41.                 */

  42.         }

  43.         
  44.         for (i = 0; i < m-1; i++)
  45.         {

  46.                 printf("%s\n", (book + i)->name);
  47.                 printf("%s\n", (book + i)->author);
  48.                 printf("%ld\n", (book + i)->date);
  49.         }

  50. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-26 23:28:20 | 显示全部楼层
巴巴鲁 发表于 2020-9-26 22:11
我的编译器不支持scanf_s,你手动改一下

0x0F72E63C (ucrtbased.dll)处(位于 Project2.exe 中)引发的异常: 0xC0000005: 写入位置 0x009DE000 时发生访问冲突。
   大佬,现在就是SCANF输入不管加不加&,都可运行,但是写入数据后,会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-27 08:03:21 | 显示全部楼层    本楼为最佳答案   
汽车行业工程师 发表于 2020-9-26 23:28
0x0F72E63C (ucrtbased.dll)处(位于 Project2.exe 中)引发的异常: 0xC0000005: 写入位置 0x009DE000 时发 ...

改成scanf_s(),不行了?
再后面添加指定长度scanf_s("%s",((book+m-1)->name),40),同理,后面那个加个10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-13 22:53:01 | 显示全部楼层
巴巴鲁 发表于 2020-9-27 08:03
改成scanf_s(),不行了?
再后面添加指定长度scanf_s("%s",((book+m-1)->name),40),同理,后面那个加个1 ...

谢谢大佬,问题就出在VS需要在scanf字符串后标定大小,以及字符串比较调用函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-13 23:11:56 | 显示全部楼层
汽车行业工程师 发表于 2020-10-13 22:53
谢谢大佬,问题就出在VS需要在scanf字符串后标定大小,以及字符串比较调用函数

vs还行吧,最近也是在摸索
以前用的都是dev
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-13 23:46:46 | 显示全部楼层
巴巴鲁 发表于 2020-9-27 08:03
改成scanf_s(),不行了?
再后面添加指定长度scanf_s("%s",((book+m-1)->name),40),同理,后面那个加个1 ...

麻烦看下,最后改成指定查看的话哪有问题,提示的是lookup  STACK周围已被占据



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

main()
{
        struct Library {
                char name[30];
                char author[10];
                long int date;

};
        int i;
        struct  Library *book = NULL;
        int m=1;
        while (1)
        {
               
               
                book= (struct Library*)realloc(book, m * sizeof(struct Library));
                printf("please input %d name of book(iput -1 exit):", m);
                scanf_s("%s",((book+m-1)->name),31);
                if (strcmp(((book + m - 1)->name), "-1") == 0) // 两个字符串比较,而不是字符与整型常量
                {
                        break;
                }
                printf("please input %d author of book:", m);
                scanf_s("%s", ((book + m - 1)->author),11);
                printf("please input %d date of book:", m);
                scanf_s("%ld", &((book + m - 1)->date),8);
               
                m++;
               

        }
        char lookup[30];
        int k=0;
        printf("please input name of book wiht you want to lookup:");
        scanf_s("%s",&lookup, 31);
        for (i = 0; i < m-1; i++)
        {
                if (strcmp(((book + i)->name),lookup) == 0) // 两个字符串比较,而不是字符与整型常量
                {
                        break;
                }
                k++;
        }
        printf("%s\n", (book + k)->name);
        printf("%s\n", (book + k)->author);
        printf("%ld\n", (book + k)->date);

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-13 23:48:56 | 显示全部楼层
汽车行业工程师 发表于 2020-10-13 23:46
麻烦看下,最后改成指定查看的话哪有问题,提示的是lookup  STACK周围已被占据

查询的结果可以正确运行出来,但是最后大括号处报错Run-Time Check Failure #2 - Stack around the variable 'lookup' was corrupted.。我想lookup就是普通变量,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 13:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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