在C中更改数字数组中的值

时间:2014-10-24 19:00:14

标签: c

我想创建一个程序,它使用我创建的函数,它将数组X的所有元素(长度为N)与一些数字K交换,只有当该元素大于K时才有。我在哪里这里出错了?

#include <stdio.h>
#include <stdlib.h>

int swap_K(int *, int);
int main()
{
    int N,i,K;
    printf("Enter N: ");
    scanf("%d",&N);
    printf("Enter K: ");
    scanf("%d",&K);
    int X[N];
    for (i=1; i<=sizeof(X)/sizeof(int); i++){
       printf("Enter %d. element: ",i);
       scanf("%d",&X[i]);
    }
    swap_K(X,K);

    for (i=1; i<=sizeof(X)/sizeof(int); i++){
        printf("%d",X[i]);
    }
}

int swap_K(int *X, int K)
{
    int i;
    for (i=1; i<=sizeof(X)/sizeof(int); i++){
        if (X[i]>K)
            X[i]=K;
    }
    return X;
}

4 个答案:

答案 0 :(得分:1)

swap_K(int *X, int K)中,sizeof(X)sizeof(int *),而不是数组的大小。

在C中,指针与数组实际上并不相同。

要解决此问题,请在任何地方使用N代替sizeof(X)/sizeof(int),尤其是在swap_K()内。

答案 1 :(得分:0)

1)数组以索引0开头。

2)在您的main功能中,您不需要在sizeof(X)/sizeof(int)循环中使用for,因为您已经知道它等于N

3)当您将数组传递给函数时,您将发送衰减为指针的数组的基址,因此在swap_K函数中,sizeof(X)将返回sizeof(int)4(通常)。

要解决此问题,您应该从main函数发送数组的大小。例如:swap_K(X,K,N);

4)当您从X函数发送swap_K的基址时,您无需从X返回main

例如:


#include <stdio.h>
#include <stdlib.h>

int swap_K(int *, int, int);
int main()
{
    int N,i,K;
    printf("Enter N: ");
    scanf("%d",&N);
    printf("Enter K: ");
    scanf("%d",&K);
    int X[N];
    for (i=0; i<N; i++)
    {
       printf("Enter %d. element: ",i);
       scanf("%d",&X[i]);
    }
    swap_K(X,K,N);
    for (i=0; i<N; i++)
    {
        printf("%d",X[i]);
    }
}

int swap_K(int *X, int K,int N)
{
    int i;
    for (i=0; i<N; i++)
    {
        if (X[i]>K)
            X[i]=K;
    }
   //return X;  //This is not required
}

答案 2 :(得分:0)

您的循环不正确

for (i=1; i<=sizeof(X)/sizeof(int); i++)

应该是

for (i=0; i<N; i++)

答案 3 :(得分:0)

发布的代码有几个问题:

  1. C中的数组是0索引的,因此for循环应始终从0迭代到N - 1.迭代过N是缓冲区溢出
  2. 指向数组的指针只是指向数组第一个元素的指针。交换函数无法知道传递给它的指针是否是数组或单个值的一部分。考虑到这一点,它需要采用另一个参数来说明传入的数组的大小是什么作为指针。循环内的迭代将使用该值而不是sizeof(X)/ sizeof(int)= 1
  3. 您将X定义为可变大小的数组,该数组完全在堆栈上分配。引入相当大的N会导致程序崩溃。如果您不知道输入的大小,最好在堆中分配数组。