【问题标题】:Why does the pointers cant pass the right values(C)?为什么指针不能传递正确的值(C)?
【发布时间】:2022-01-11 23:23:11
【问题描述】:

我被赋予了这个任务:

编写一个接受整数数组“arr”及其大小的函数 “n”和一个整数“key”(已知数组至少有 2 整数)。

如果数组中有两个整数的和小于“key”,则该函数检查并返回 1,否则该函数 返回0。另外如果有满足这个条件的整数,函数会将它们的值传递给“n”和“key”,否则传递-1。

这是我的解决方案:

int ex5(int* arr, int* n, int* key)
{
    while (*n > 0)
    {
        int i;
        for (i = 0; i < *n - 1; i++)
        {
            if (arr[*n-1] + arr[i] < *key)
            {
                
                *n = arr[i];
                *key = arr[*n-1];*
                return 1;
            }
        }
        --*n;
    }
    *n = -1;
    *key = -1;
    return 0;
}

这是我的主要功能:

int main()
{
    int arr[] = {1, 6, 2, 4, 3}, n = 5, key = 4;
    int res = ex5(arr, &n, &key);
    printf("%d %d %d", res, n, key);
}

但是,当我运行我的代码时,函数返回 1 并传递 (n = 1, key = 1),它应该传递 (n = 2, key = 1)

【问题讨论】:

标签: arrays c pointers


【解决方案1】:
*n = arr[i]; 
*key = arr[*n-1]; 

上面代码中的第二行读取arr[arr[i]-1]; 这可能超出范围,例如arr[i] 是 1000,而数组中只有 5 个元素。数组中的值与数组大小之间没有关系。至少颠倒顺序:

*key = arr[*n-1]; 
*n = arr[i];

您还可以使用两个循环来简化代码。示例

int ex5(int* arr, int *size, int *key)
{
    for (int i = 0; i < *size; i++)
        for (int k = i + 1; k < *size; k++)
            if (arr[i] + arr[k] < *key)
            {
                *key = arr[i];
                *size = arr[k];
                return 1;
            }
    return 0;
}

【讨论】:

    【解决方案2】:

    为满足条件的循环写 2 个。

    int ex5(int* arr, int *size, int *key)
    {
    int i=0;
    while(i<*size)
    {
    int k=i+1;
    while(k<*size)
    {
    if (arr[i] + arr[k] < *key)
    {
    *key = arr[i];
    *size = arr[k];
    return 1;
    }
    i++;
    }
    return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 2016-09-30
      • 2014-07-25
      相关资源
      最近更新 更多