鱼C论坛

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

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

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

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

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

x
#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[arrlen(arr)];
    size_t j = 0;
    for (size_t i = 0; i < arrlen(arr); i++)
    {
        if (*(arr + i) == key)
        {
            temp[j] = i;
            j++;
        }
    }
    if (j >= 1)
    {
        printf("数据:%d\n出现次数:%d\n下标为:", key, j);
        for (size_t i = 0; i < j; i++)
        {
            printf("%02d ", temp[i]);
        }
    }
    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[m], b[n];
    srand(time(NULL));
    for (size_t i = 0; i < m; i++)
    {
        a[i] = rand()%5+5;
        printf("%d ", a[i]);
    }
    a[m] = el;
    printf("\n%d", arrlen(a));//运行正常
    printf("\n\n");
    for (size_t i = 0; i < n; i++)
    {
        b[i] = rand()%5+5;
        printf("%d ", b[i]);
    }
    b[n] = el;
    printf("\n%d", arrlen(b));//运行正常
    arrcat(a, b);
    printf("\n%d", arrlen(a));//运行到这里出现分段故障,注释掉这一句又会变得正常,头疼找不到问题在哪
    
}
最佳答案
2019-5-31 23:27:41
看你写了这么多感觉也算是复杂的代码了,看得我都晕。

但是你没注意到,要拼接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[arrlen(arr)];
    size_t j = 0;
    for (size_t i = 0; i < arrlen(arr); i++)
    {
        if (*(arr + i) == key)
        {
            temp[j] = i;
            j++;
        }
    }
    if (j >= 1)
    {
        printf("数据:%d\n出现次数:%d\n下标为:", key, j);
        for (size_t i = 0; i < j; i++)
        {
            printf("%02d ", temp[i]);
        }
    }
    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[m], b[n];
    srand(time(NULL));
    for (size_t i = 0; i < m; i++)
    {
        a[i] = rand()%5+5;
        printf("%d ", a[i]);
    }
    a[m] = el;
    len_m = arrlen(a);
    printf("\n%d", len_m);//运行正常

    printf("\n\n");
    for (size_t i = 0; i < n; i++)
    {
        b[i] = rand()%5+5;
        printf("%d ", b[i]);
    }
    b[n] = 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));//运行到这里出现分段故障,注释掉这一句又会变得正常,头疼找不到问题在哪

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

使用道具 举报

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

但是你没注意到,要拼接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[arrlen(arr)];
    size_t j = 0;
    for (size_t i = 0; i < arrlen(arr); i++)
    {
        if (*(arr + i) == key)
        {
            temp[j] = i;
            j++;
        }
    }
    if (j >= 1)
    {
        printf("数据:%d\n出现次数:%d\n下标为:", key, j);
        for (size_t i = 0; i < j; i++)
        {
            printf("%02d ", temp[i]);
        }
    }
    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[m], b[n];
    srand(time(NULL));
    for (size_t i = 0; i < m; i++)
    {
        a[i] = rand()%5+5;
        printf("%d ", a[i]);
    }
    a[m] = el;
    len_m = arrlen(a);
    printf("\n%d", len_m);//运行正常

    printf("\n\n");
    for (size_t i = 0; i < n; i++)
    {
        b[i] = rand()%5+5;
        printf("%d ", b[i]);
    }
    b[n] = 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));//运行到这里出现分段故障,注释掉这一句又会变得正常,头疼找不到问题在哪

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

使用道具 举报

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

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



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

怪不得我找了一天都没找到那些代码哪里出错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不用动态数组,你也可以先声明个足够大的数组不一样的。
int mn[10000];
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 19:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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