簡體   English   中英

在C中更改數字數組中的值

[英]Changing the values in a number array in 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;
}

swap_K(int *X, int K)sizeof(X)sizeof(int *) ,而不是數組的大小。

在C語言中,指針與數組並不完全相同。

要修復此問題,請在所有地方使用N代替sizeof(X)/sizeof(int) ,尤其是。 swap_K()內部。

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)當您從main函數發送X的基地址時,不需要從swap_K返回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
}

您的循環不正確

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

它應該是

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

發布的代碼存在幾個問題:

  1. C中的數組是0索引的,因此for循環應始終從0迭代到N-1。迭代N是緩沖區溢出
  2. 指向數組的指針只是指向數組第一個元素的指針。 交換函數無法知道傳遞給它的指針是數組的一部分還是單個值。 考慮到這一點,將需要采用另一個參數,該參數告訴傳入數組作為指針的大小。 循環內部的迭代將使用該值,而不是sizeof(X)/ sizeof(int)= 1
  3. 您將X定義為完全在堆棧上分配的可變大小數組。 引入一個相當大的N將使您的程序崩潰。 如果您不知道輸入的大小,最好在堆中分配數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM