鱼C论坛

 找回密码
 立即注册
查看: 484|回复: 4

[已解决]关于动态内存管理2课后作业编写时的疑问

[复制链接]
发表于 2020-4-26 14:54:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 yexing 于 2020-4-26 15:53 编辑

原题:
TIM图片20200426145108.png
我的代码:(还未编写完成)
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void ass_element(int *pta, int row, int col, int num);
  5. int get_element(int * pta, int row, int col);
  6. void print_array(int * pta, int row, int col);


  7. void ass_element(int * pta, int row, int col, int num)
  8. {
  9.         //待开发
  10. }

  11. int get_element(int * pta, int row, int col)
  12. {
  13.         //待开发
  14. }

  15. void print_array(int * pta, int row, int col)
  16. {
  17.         int i, j;
  18.         for (i = 0; i < row; i++)
  19.         {
  20.                 for (j = 0; j < col; j++)
  21.                 {
  22.                         printf("%d ", pta[i*j + j]);
  23.                 }
  24.                 putchar('\n');
  25.         }
  26.         putchar('\n');
  27. }

  28. int main(void)
  29. {
  30.         int command, row, col, temp_num;
  31.         int row_array, col_array;
  32.         int * pta = NULL;
  33.         char confirm, c;
  34.        
  35.         printf("\n\
  36. ============================\n\
  37. * 欢迎使用该程序,指令如下 *\n\
  38. * 1.生成一个 M*N 的矩阵    *\n\
  39. * 2.初始化矩阵             *\n\
  40. * 3.给矩阵中某个元素赋值   *\n\
  41. * 4.读取矩阵中某个元素     *\n\
  42. * 5.打印整个矩阵           *\n\
  43. * 6.结束程序               *\n\
  44. ============================\n");

  45.         while (1)
  46.         {
  47.                 printf("\n请输入指令:");
  48.                 scanf("%d", &command);
  49.                 while (command < 1 || command > 6)
  50.                 {
  51.                         printf("指令输入错误,请重新输入:");
  52.                         while ((c = getchar()) != EOF && c != '\n')
  53.                                 ;
  54.                         scanf("%d", &command);
  55.                 }
  56.                
  57.                 if (command == 6)
  58.                         break;
  59.                
  60.                 if (command == 1)
  61.                 {
  62.                         if (pta == NULL)
  63.                         {
  64.                                 printf("请输入新矩阵的规模:");
  65.                                 while ((c = getchar()) != EOF && c != '\n')
  66.                                         ;
  67.                                 scanf("%d*%d", &row, &col);
  68.                                 pta = (int *)malloc(row * col*sizeof(int));
  69.                                 memset(pta, 0, row*col*sizeof(int));
  70.                                 row_array = row;
  71.                                 col_array = col;
  72.                                 printf("%d*%d 的矩形创建成功!\n", row, col);
  73.                         }
  74.                         else
  75.                         {
  76.                                 printf("矩阵已存在,是否需要重新创建?(Y/N)-> ");
  77.                                 while ((c = getchar()) != EOF && c != '\n')
  78.                                         ;
  79.                                 scanf("%c", &confirm);
  80.                                 if (confirm == 'Y')
  81.                                 {
  82.                                         printf("请输入新矩阵的规模:");
  83.                                         while ((c = getchar()) != EOF && c != '\n')
  84.                                                 ;
  85.                                         scanf("%d*%d", &row, &col);
  86.                                         free(pta);
  87.                                         pta = (int *)malloc(row * col * sizeof(int));
  88.                                         row_array = row;
  89.                                         col_array = col;
  90.                                         memset(pta, 0, row_array * col_array * sizeof(int));
  91.                                         printf("%d*%d 的矩形创建成功!\n", row_array, col_array);
  92.                                 }
  93.                                 else
  94.                                 {
  95.                                         printf("创建失败。\n");
  96.                                 }
  97.                         }
  98.                 }
  99.                
  100.                 else if (command == 2)
  101.                 {
  102.                         if (pta == NULL) {
  103.                                 printf("矩形未创建!初始化失败。\n");
  104.                         }else{
  105.                                 printf("请输入一个数字:");
  106.                                 while ((c = getchar()) != EOF && c != '\n')
  107.                                         ;
  108.                                 scanf("%d", &temp_num);
  109.                                 memset(pta, temp_num, row_array * col_array * sizeof(int));
  110.                                 putchar('\n');
  111.                         }
  112.                 }
  113.                
  114.                 else if (command == 3)
  115.                 {
  116.                         if (pta == NULL) {
  117.                                 printf("矩形未创建!无法赋值。\n");
  118.                         }else{
  119.                                 printf("请输入要修改的位置(行,列)-> ");
  120.                                 while ((c = getchar()) != EOF && c != '\n')
  121.                                         ;
  122.                                 scanf("%d,%d", &row, &col);
  123.                                 printf("请输入一个数字:");
  124.                                 scanf("%d", &temp_num);
  125.                                 ass_element(pta, row, col, temp_num);
  126.                         }
  127.                 }
  128.                
  129.                 else if (command == 4)
  130.                 {
  131.                         if (pta == NULL) {
  132.                                 printf("矩阵未创建!无法读取元素。\n");
  133.                         }else{
  134.                                 printf("请输入要读取的位置(行,列)-> ");
  135.                                 while ((c = getchar()) != EOF && c != '\n')
  136.                                         ;
  137.                                 scanf("%d,%d", &row, &col);
  138.                                 printf("第%d行,第%d列的数字是:%d\n", row, col, get_element(pta, row, col));
  139.                         }
  140.                 }
  141.                
  142.                 else if (command == 5)
  143.                 {
  144.                         if (pta == NULL) {
  145.                                 printf("矩形未创建!无法打印。\n");
  146.                         }else{
  147.                                 print_array(pta, row_array, col_array);
  148.                         }
  149.                 }
  150.         }
  151.        
  152.         printf("\n感谢使用本程序^_^\n");
  153.         free(pta);
  154.        
  155.         return 0;
  156. }
复制代码


运行结果:
TIM图片20200426144840.png

我的问题:
1. 为什么使用指令1后再次使用,会直接创建失败?求指明问题并修改(已解决)
2. 为什么使用指令2会初始化一堆随机数值?求指明问题并修改
最佳答案
2020-4-26 15:27:10
你在第84行之前需要清空缓冲区,否则,scanf 会将缓冲区的'\n'当做%c赋值给confirm,这样就出错了。
有的编译器可以用以下函数,但是有的编译器不认识这个函数
fflush(stdin)

为了适应更多的编译器,建议使用以下代码清空缓冲区
  1. while ((char c = getchar()) != EOF && c != '\n');
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-26 15:27:10 | 显示全部楼层    本楼为最佳答案   
你在第84行之前需要清空缓冲区,否则,scanf 会将缓冲区的'\n'当做%c赋值给confirm,这样就出错了。
有的编译器可以用以下函数,但是有的编译器不认识这个函数
fflush(stdin)

为了适应更多的编译器,建议使用以下代码清空缓冲区
  1. while ((char c = getchar()) != EOF && c != '\n');
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 15:49:15 | 显示全部楼层
sunrise085 发表于 2020-4-26 15:27
你在第84行之前需要清空缓冲区,否则,scanf 会将缓冲区的'\n'当做%c赋值给confirm,这样就出错了。
有的 ...


好的谢谢,那初始化数值变成随机数的问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 16:35:17 | 显示全部楼层
yexing 发表于 2020-4-26 15:49
好的谢谢,那初始化数值变成随机数的问题?

那不是随机数,
是你对初始化函数理解有偏差
初始化函数一般只用0进行初始化,因为它是以字节赋值的,
你用5进行初始化,实际上得到的是0x05050505也就是你看到的84215045
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 18:49:57 | 显示全部楼层
sunrise085 发表于 2020-4-26 16:35
那不是随机数,
是你对初始化函数理解有偏差
初始化函数一般只用0进行初始化,因为它是以字节赋值的,
...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 21:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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