哪里出问题了,找了一天了
#include <stdio.h>#include <assert.h>
/*用字符e表示一个数字数组的结束,el = endline*/
#define el "'e'"
/*数组长度函数*/
int arrlen(size_t arr[])
{
assert(arr != NULL);
size_t i = 0;
for (; *arr != el; arr++)
{
i++;
}
/*while (*arr != el)
{
arr++;
i++;
}*/
return i;
}
/*数字数组排序函数*/
int arrsrt(size_t arr[])
{
assert(arr != NULL);
for (size_t i = 0; i < arrlen(arr); i++)
{
for (size_t j = 0, k = 0; j < arrlen(arr) - 1; j++)
{
if (*(arr + j) > *(arr + j + 1))
{
k = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j + 1) = k;
}
}
}
return arr;
}
/*数字数组拼接函数arrcat(arr1, arr2)*/
void arrcat(size_t arr1[], size_t arr2[])
{
assert((arr1 != NULL) && (arr2 != NULL));
while (*arr1 != el)
{
arr1++; //跳到arri尾地址
}
while (*arr2 != el)
{
*(arr1++) = *(arr2++); //复制arr2数据到arr1尾部
}
*arr1 = el;
}
/*数组搜索函数*/
void arrsch(size_t arr[], size_t key)
{
assert(arr != NULL);
size_t temp;
size_t j = 0;
for (size_t i = 0; i < arrlen(arr); i++)
{
if (*(arr + i) == key)
{
temp = i;
j++;
}
}
if (j >= 1)
{
printf("数据:%d\n出现次数:%d\n下标为:", key, j);
for (size_t i = 0; i < j; i++)
{
printf("%02d ", temp);
}
}
else
{
printf("数据: %d\n出现次数: %d\n下标为: NULL", key, 0);
}
}
/*数字数组替换函数*/
int arrrpl(size_t arr[], size_t key, size_t num)
{
assert(arr != NULL);
size_t i = 0;
for (; *arr != el; arr++)
{
if (*arr == key)
{
i++;
break;
}
}
switch (i)
{
case 0:
return 0;
break;
case 1:
if ((*arr == 0) && (key == 0))
{
*arr = num;
}
else
{
for (; *arr != el; arr++)
{
if (*arr == key)
{
*arr = num;
}
}
}
return arr;
break;
}
}
#include <stdio.h>
#include <time.h>
#include "E:\Administrator\Documents\My C\My C Function\Function.c"
/*数组搜索函数*/
void main()
{
int m, n;
m = rand()%5+5;
n = rand()%5+5;
int a, b;
srand(time(NULL));
for (size_t i = 0; i < m; i++)
{
a = rand()%5+5;
printf("%d ", a);
}
a = el;
printf("\n%d", arrlen(a));//运行正常
printf("\n\n");
for (size_t i = 0; i < n; i++)
{
b = rand()%5+5;
printf("%d ", b);
}
b = el;
printf("\n%d", arrlen(b));//运行正常
arrcat(a, b);
printf("\n%d", arrlen(a));//运行到这里出现分段故障,注释掉这一句又会变得正常,头疼找不到问题在哪
} 看你写了这么多感觉也算是复杂的代码了,看得我都晕。
但是你没注意到,要拼接2个数组,得要先有足够大的空间来拼接。
假如你数组a 分了10个, 数组b也分了10个,而且都存满了,这怎么拼?
假如你数组a 分了10个, 数组b也分了10个, a,b都各存了4个元素,这时你要把b拼入a是可以的。
#include <stdio.h>
#include <time.h>
#include <stdio.h>
#include <assert.h>
/*用字符e表示一个数字数组的结束,el = endline*/
#define el "'e'"
/*数组长度函数*/
int arrlen(size_t arr[])
{
assert(arr != NULL);
size_t i = 0;
for (; *arr != el; arr++)
{
i++;
}
/*while (*arr != el)
{
arr++;
i++;
}*/
return i;
}
/*数字数组排序函数*/
int arrsrt(size_t arr[])
{
assert(arr != NULL);
for (size_t i = 0; i < arrlen(arr); i++)
{
for (size_t j = 0, k = 0; j < arrlen(arr) - 1; j++)
{
if (*(arr + j) > *(arr + j + 1))
{
k = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j + 1) = k;
}
}
}
return arr;
}
/*数字数组拼接函数arrcat(arr1, arr2)*/
void arrcat(size_t arr1[], size_t arr2[], int *p)
{
assert((arr1 != NULL) && (arr2 != NULL));
while (*arr1 != el)
{
*p++ = *arr1++; //跳到arri尾地址
}
while (*arr2 != el)
{
*p++ = *arr2++;
}
*p = el;
}
/*数组搜索函数*/
void arrsch(size_t arr[], size_t key)
{
assert(arr != NULL);
size_t temp;
size_t j = 0;
for (size_t i = 0; i < arrlen(arr); i++)
{
if (*(arr + i) == key)
{
temp = i;
j++;
}
}
if (j >= 1)
{
printf("数据:%d\n出现次数:%d\n下标为:", key, j);
for (size_t i = 0; i < j; i++)
{
printf("%02d ", temp);
}
}
else
{
printf("数据: %d\n出现次数: %d\n下标为: NULL", key, 0);
}
}
/*数字数组替换函数*/
int arrrpl(size_t arr[], size_t key, size_t num)
{
assert(arr != NULL);
size_t i = 0;
for (; *arr != el; arr++)
{
if (*arr == key)
{
i++;
break;
}
}
switch (i)
{
case 0:
return 0;
break;
case 1:
if ((*arr == 0) && (key == 0))
{
*arr = num;
}
else
{
for (; *arr != el; arr++)
{
if (*arr == key)
{
*arr = num;
}
}
}
return arr;
break;
}
}
/*数组搜索函数*/
void main()
{
int m, n;
int len_m, len_n, len_mn;
int *p = NULL;
m = rand()%5+5;
n = rand()%5+5;
int a, b;
srand(time(NULL));
for (size_t i = 0; i < m; i++)
{
a = rand()%5+5;
printf("%d ", a);
}
a = el;
len_m = arrlen(a);
printf("\n%d", len_m);//运行正常
printf("\n\n");
for (size_t i = 0; i < n; i++)
{
b = rand()%5+5;
printf("%d ", b);
}
b = el;
len_n = arrlen(b);
printf("\n%d", arrlen(b));//运行正常
len_mn = len_m + len_n;
p = malloc(len_mn*sizeof(int));
arrcat(a, b, p);
printf("\n%d", arrlen(p));//运行到这里出现分段故障,注释掉这一句又会变得正常,头疼找不到问题在哪
}
本帖最后由 bin554385863 于 2019-5-31 23:53 编辑
ba21 发表于 2019-5-31 23:27
看你写了这么多感觉也算是复杂的代码了,看得我都晕。
但是你没注意到,要拼接2个数组,得要先有足够大 ...
{:10_266:}{:10_266:}
MMP,没注意这个问题.等我学了动态数组在优化一下
多谢
怪不得我找了一天都没找到那些代码哪里出错了{:10_266:} bin554385863 发表于 2019-5-31 23:50
MMP,没注意这个问题.等我学了动态数组在优化一下
多谢
不用动态数组,你也可以先声明个足够大的数组不一样的。
int mn;
页:
[1]