鱼C论坛

 找回密码
 立即注册
查看: 1615|回复: 3

[已解决]哪里出问题了,找了一天了

[复制链接]
发表于 2019-5-31 23:02:27 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <assert.h>
  3. /*用字符e表示一个数字数组的结束,el = endline*/
  4. #define el "'e'"
  5. /*数组长度函数*/
  6. int arrlen(size_t arr[])
  7. {
  8.     assert(arr != NULL);
  9.     size_t i = 0;
  10.     for (; *arr != el; arr++)
  11.     {
  12.         i++;
  13.     }

  14.     /*while (*arr != el)
  15.     {
  16.         arr++;
  17.         i++;
  18.     }*/
  19.     return i;
  20. }

  21. /*数字数组排序函数*/
  22. int arrsrt(size_t arr[])
  23. {
  24.     assert(arr != NULL);
  25.     for (size_t i = 0; i < arrlen(arr); i++)
  26.     {
  27.         for (size_t j = 0, k = 0; j < arrlen(arr) - 1; j++)
  28.         {
  29.             if (*(arr + j) > *(arr + j + 1))
  30.             {
  31.                 k = *(arr + j);
  32.                 *(arr + j) = *(arr + j + 1);
  33.                 *(arr + j + 1) = k;
  34.             }
  35.         }
  36.     }
  37.     return arr;
  38. }

  39. /*数字数组拼接函数arrcat(arr1, arr2)*/
  40. void arrcat(size_t arr1[], size_t arr2[])
  41. {
  42.     assert((arr1 != NULL) && (arr2 != NULL));
  43.     while (*arr1 != el)
  44.     {
  45.         arr1++; //跳到arri尾地址
  46.     }
  47.     while (*arr2 != el)
  48.     {
  49.         *(arr1++) = *(arr2++); //复制arr2数据到arr1尾部
  50.     }
  51.     *arr1 = el;
  52. }

  53. /*数组搜索函数*/
  54. void arrsch(size_t arr[], size_t key)
  55. {
  56.     assert(arr != NULL);
  57.     size_t temp[arrlen(arr)];
  58.     size_t j = 0;
  59.     for (size_t i = 0; i < arrlen(arr); i++)
  60.     {
  61.         if (*(arr + i) == key)
  62.         {
  63.             temp[j] = i;
  64.             j++;
  65.         }
  66.     }
  67.     if (j >= 1)
  68.     {
  69.         printf("数据:%d\n出现次数:%d\n下标为:", key, j);
  70.         for (size_t i = 0; i < j; i++)
  71.         {
  72.             printf("%02d ", temp[i]);
  73.         }
  74.     }
  75.     else
  76.     {
  77.         printf("数据: %d\n出现次数: %d\n下标为: NULL", key, 0);
  78.     }
  79. }

  80. /*数字数组替换函数*/
  81. int arrrpl(size_t arr[], size_t key, size_t num)
  82. {
  83.     assert(arr != NULL);
  84.     size_t i = 0;
  85.     for (; *arr != el; arr++)
  86.     {
  87.         if (*arr == key)
  88.         {
  89.             i++;
  90.             break;
  91.         }
  92.     }
  93.     switch (i)
  94.     {
  95.     case 0:
  96.         return 0;
  97.         break;
  98.     case 1:
  99.         if ((*arr == 0) && (key == 0))
  100.         {
  101.             *arr = num;
  102.         }
  103.         else
  104.         {
  105.             for (; *arr != el; arr++)
  106.             {
  107.                 if (*arr == key)
  108.                 {
  109.                     *arr = num;
  110.                 }
  111.             }
  112.         }
  113.         return arr;
  114.         break;
  115.     }
  116. }
复制代码

  1. #include <stdio.h>
  2. #include <time.h>
  3. #include "E:\Administrator\Documents\My C\My C Function\Function.c"

  4. /*数组搜索函数*/
  5. void main()
  6. {
  7.     int m, n;
  8.     m = rand()%5+5;
  9.     n = rand()%5+5;
  10.     int a[m], b[n];
  11.     srand(time(NULL));
  12.     for (size_t i = 0; i < m; i++)
  13.     {
  14.         a[i] = rand()%5+5;
  15.         printf("%d ", a[i]);
  16.     }
  17.     a[m] = el;
  18.     printf("\n%d", arrlen(a));//运行正常
  19.     printf("\n\n");
  20.     for (size_t i = 0; i < n; i++)
  21.     {
  22.         b[i] = rand()%5+5;
  23.         printf("%d ", b[i]);
  24.     }
  25.     b[n] = el;
  26.     printf("\n%d", arrlen(b));//运行正常
  27.     arrcat(a, b);
  28.     printf("\n%d", arrlen(a));//运行到这里出现分段故障,注释掉这一句又会变得正常,头疼找不到问题在哪
  29.    
  30. }
复制代码
最佳答案
2019-5-31 23:27:41
看你写了这么多感觉也算是复杂的代码了,看得我都晕。

但是你没注意到,要拼接2个数组,得要先有足够大的空间来拼接。
假如你数组a 分了10个, 数组b也分了10个,而且都存满了,这怎么拼?
假如你数组a 分了10个, 数组b也分了10个, a,b都各存了4个元素,这时你要把b拼入a是可以的。

  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdio.h>
  4. #include <assert.h>


  5. /*用字符e表示一个数字数组的结束,el = endline*/
  6. #define el "'e'"
  7. /*数组长度函数*/
  8. int arrlen(size_t arr[])
  9. {
  10.     assert(arr != NULL);
  11.     size_t i = 0;
  12.     for (; *arr != el; arr++)
  13.     {
  14.         i++;
  15.     }

  16.     /*while (*arr != el)
  17.     {
  18.         arr++;
  19.         i++;
  20.     }*/
  21.     return i;
  22. }

  23. /*数字数组排序函数*/
  24. int arrsrt(size_t arr[])
  25. {
  26.     assert(arr != NULL);
  27.     for (size_t i = 0; i < arrlen(arr); i++)
  28.     {
  29.         for (size_t j = 0, k = 0; j < arrlen(arr) - 1; j++)
  30.         {
  31.             if (*(arr + j) > *(arr + j + 1))
  32.             {
  33.                 k = *(arr + j);
  34.                 *(arr + j) = *(arr + j + 1);
  35.                 *(arr + j + 1) = k;
  36.             }
  37.         }
  38.     }
  39.     return arr;
  40. }

  41. /*数字数组拼接函数arrcat(arr1, arr2)*/
  42. void arrcat(size_t arr1[], size_t arr2[], int *p)
  43. {
  44.     assert((arr1 != NULL) && (arr2 != NULL));
  45.     while (*arr1 != el)
  46.     {
  47.         *p++ = *arr1++; //跳到arri尾地址
  48.     }

  49.     while (*arr2 != el)
  50.     {
  51.         *p++ = *arr2++;
  52.     }
  53.     *p = el;
  54. }

  55. /*数组搜索函数*/
  56. void arrsch(size_t arr[], size_t key)
  57. {
  58.     assert(arr != NULL);
  59.     size_t temp[arrlen(arr)];
  60.     size_t j = 0;
  61.     for (size_t i = 0; i < arrlen(arr); i++)
  62.     {
  63.         if (*(arr + i) == key)
  64.         {
  65.             temp[j] = i;
  66.             j++;
  67.         }
  68.     }
  69.     if (j >= 1)
  70.     {
  71.         printf("数据:%d\n出现次数:%d\n下标为:", key, j);
  72.         for (size_t i = 0; i < j; i++)
  73.         {
  74.             printf("%02d ", temp[i]);
  75.         }
  76.     }
  77.     else
  78.     {
  79.         printf("数据: %d\n出现次数: %d\n下标为: NULL", key, 0);
  80.     }
  81. }

  82. /*数字数组替换函数*/
  83. int arrrpl(size_t arr[], size_t key, size_t num)
  84. {
  85.     assert(arr != NULL);
  86.     size_t i = 0;
  87.     for (; *arr != el; arr++)
  88.     {
  89.         if (*arr == key)
  90.         {
  91.             i++;
  92.             break;
  93.         }
  94.     }
  95.     switch (i)
  96.     {
  97.     case 0:
  98.         return 0;
  99.         break;
  100.     case 1:
  101.         if ((*arr == 0) && (key == 0))
  102.         {
  103.             *arr = num;
  104.         }
  105.         else
  106.         {
  107.             for (; *arr != el; arr++)
  108.             {
  109.                 if (*arr == key)
  110.                 {
  111.                     *arr = num;
  112.                 }
  113.             }
  114.         }
  115.         return arr;
  116.         break;
  117.     }
  118. }


  119. /*数组搜索函数*/
  120. void main()
  121. {
  122.     int m, n;

  123.     int len_m, len_n, len_mn;
  124.     int *p = NULL;

  125.     m = rand()%5+5;
  126.     n = rand()%5+5;
  127.     int a[m], b[n];
  128.     srand(time(NULL));
  129.     for (size_t i = 0; i < m; i++)
  130.     {
  131.         a[i] = rand()%5+5;
  132.         printf("%d ", a[i]);
  133.     }
  134.     a[m] = el;
  135.     len_m = arrlen(a);
  136.     printf("\n%d", len_m);//运行正常

  137.     printf("\n\n");
  138.     for (size_t i = 0; i < n; i++)
  139.     {
  140.         b[i] = rand()%5+5;
  141.         printf("%d ", b[i]);
  142.     }
  143.     b[n] = el;
  144.     len_n = arrlen(b);
  145.     printf("\n%d", arrlen(b));//运行正常

  146.     len_mn = len_m + len_n;
  147.     p = malloc(len_mn*sizeof(int));
  148.     arrcat(a, b, p);

  149.     printf("\n%d", arrlen(p));//运行到这里出现分段故障,注释掉这一句又会变得正常,头疼找不到问题在哪

  150. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-31 23:27:41 | 显示全部楼层    本楼为最佳答案   
看你写了这么多感觉也算是复杂的代码了,看得我都晕。

但是你没注意到,要拼接2个数组,得要先有足够大的空间来拼接。
假如你数组a 分了10个, 数组b也分了10个,而且都存满了,这怎么拼?
假如你数组a 分了10个, 数组b也分了10个, a,b都各存了4个元素,这时你要把b拼入a是可以的。

  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdio.h>
  4. #include <assert.h>


  5. /*用字符e表示一个数字数组的结束,el = endline*/
  6. #define el "'e'"
  7. /*数组长度函数*/
  8. int arrlen(size_t arr[])
  9. {
  10.     assert(arr != NULL);
  11.     size_t i = 0;
  12.     for (; *arr != el; arr++)
  13.     {
  14.         i++;
  15.     }

  16.     /*while (*arr != el)
  17.     {
  18.         arr++;
  19.         i++;
  20.     }*/
  21.     return i;
  22. }

  23. /*数字数组排序函数*/
  24. int arrsrt(size_t arr[])
  25. {
  26.     assert(arr != NULL);
  27.     for (size_t i = 0; i < arrlen(arr); i++)
  28.     {
  29.         for (size_t j = 0, k = 0; j < arrlen(arr) - 1; j++)
  30.         {
  31.             if (*(arr + j) > *(arr + j + 1))
  32.             {
  33.                 k = *(arr + j);
  34.                 *(arr + j) = *(arr + j + 1);
  35.                 *(arr + j + 1) = k;
  36.             }
  37.         }
  38.     }
  39.     return arr;
  40. }

  41. /*数字数组拼接函数arrcat(arr1, arr2)*/
  42. void arrcat(size_t arr1[], size_t arr2[], int *p)
  43. {
  44.     assert((arr1 != NULL) && (arr2 != NULL));
  45.     while (*arr1 != el)
  46.     {
  47.         *p++ = *arr1++; //跳到arri尾地址
  48.     }

  49.     while (*arr2 != el)
  50.     {
  51.         *p++ = *arr2++;
  52.     }
  53.     *p = el;
  54. }

  55. /*数组搜索函数*/
  56. void arrsch(size_t arr[], size_t key)
  57. {
  58.     assert(arr != NULL);
  59.     size_t temp[arrlen(arr)];
  60.     size_t j = 0;
  61.     for (size_t i = 0; i < arrlen(arr); i++)
  62.     {
  63.         if (*(arr + i) == key)
  64.         {
  65.             temp[j] = i;
  66.             j++;
  67.         }
  68.     }
  69.     if (j >= 1)
  70.     {
  71.         printf("数据:%d\n出现次数:%d\n下标为:", key, j);
  72.         for (size_t i = 0; i < j; i++)
  73.         {
  74.             printf("%02d ", temp[i]);
  75.         }
  76.     }
  77.     else
  78.     {
  79.         printf("数据: %d\n出现次数: %d\n下标为: NULL", key, 0);
  80.     }
  81. }

  82. /*数字数组替换函数*/
  83. int arrrpl(size_t arr[], size_t key, size_t num)
  84. {
  85.     assert(arr != NULL);
  86.     size_t i = 0;
  87.     for (; *arr != el; arr++)
  88.     {
  89.         if (*arr == key)
  90.         {
  91.             i++;
  92.             break;
  93.         }
  94.     }
  95.     switch (i)
  96.     {
  97.     case 0:
  98.         return 0;
  99.         break;
  100.     case 1:
  101.         if ((*arr == 0) && (key == 0))
  102.         {
  103.             *arr = num;
  104.         }
  105.         else
  106.         {
  107.             for (; *arr != el; arr++)
  108.             {
  109.                 if (*arr == key)
  110.                 {
  111.                     *arr = num;
  112.                 }
  113.             }
  114.         }
  115.         return arr;
  116.         break;
  117.     }
  118. }


  119. /*数组搜索函数*/
  120. void main()
  121. {
  122.     int m, n;

  123.     int len_m, len_n, len_mn;
  124.     int *p = NULL;

  125.     m = rand()%5+5;
  126.     n = rand()%5+5;
  127.     int a[m], b[n];
  128.     srand(time(NULL));
  129.     for (size_t i = 0; i < m; i++)
  130.     {
  131.         a[i] = rand()%5+5;
  132.         printf("%d ", a[i]);
  133.     }
  134.     a[m] = el;
  135.     len_m = arrlen(a);
  136.     printf("\n%d", len_m);//运行正常

  137.     printf("\n\n");
  138.     for (size_t i = 0; i < n; i++)
  139.     {
  140.         b[i] = rand()%5+5;
  141.         printf("%d ", b[i]);
  142.     }
  143.     b[n] = el;
  144.     len_n = arrlen(b);
  145.     printf("\n%d", arrlen(b));//运行正常

  146.     len_mn = len_m + len_n;
  147.     p = malloc(len_mn*sizeof(int));
  148.     arrcat(a, b, p);

  149.     printf("\n%d", arrlen(p));//运行到这里出现分段故障,注释掉这一句又会变得正常,头疼找不到问题在哪

  150. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-31 23:50:43 | 显示全部楼层
本帖最后由 bin554385863 于 2019-5-31 23:53 编辑
ba21 发表于 2019-5-31 23:27
看你写了这么多感觉也算是复杂的代码了,看得我都晕。

但是你没注意到,要拼接2个数组,得要先有足够大 ...



MMP,没注意这个问题.等我学了动态数组在优化一下
多谢

怪不得我找了一天都没找到那些代码哪里出错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-1 17:35:19 | 显示全部楼层
bin554385863 发表于 2019-5-31 23:50
MMP,没注意这个问题.等我学了动态数组在优化一下
多谢

不用动态数组,你也可以先声明个足够大的数组不一样的。
int mn[10000];
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-7 21:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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