【问题标题】:Changing the values in a number array in C在 C 中更改数字数组中的值
【发布时间】:2014-10-24 19:00:14
【问题描述】:

我想制作一个程序,它使用我创建的函数,它将数组 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;
}

【问题讨论】:

  • C scanf() problem 的可能重复项
  • 您遇到了什么具体错误?数组也从 0 开始。
  • 没有得到任何错误,编译得很好,但它只改变了数组的第一个元素。此外,将 i 从 1 更改为 0,并将“

标签: c


【解决方案1】:

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

在 C 中,指针与数组并不完全相同。

要修复它,请在任何地方使用N 而不是sizeof(X)/sizeof(int),尤其是。里面swap_K()

【讨论】:

  • 它只改变数组的第一个元素。
  • 特别是。在 swap_K() 中使用 N。
【解决方案2】:

1) 数组以索引0 开头。

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

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

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

4) 您不需要从swap_K 返回X,因为您是从main 函数发送X 的基地址。

例如:


#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
}

【讨论】:

  • 我会给每个人一个投票,但我需要声誉或smth,我不知道,在这里特别为这个问题创建了帐户。非常感谢朋友!
【解决方案3】:

你的循环不正确

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

应该是

for (i=0; i&lt;N; i++)

【讨论】:

    【解决方案4】:

    贴出的代码有几个问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2020-10-20
      相关资源
      最近更新 更多