2016-10-05 38 views
1

我寫了一個短代碼,它可以從整數數組中計算平均值。我首先創建了一個名爲mean.h的頭文件,如下所示。C:使用整數類型指針參數計算數組長度

#ifndef MEAN_H 
#define MEAN_H 

double mean(int *inputs) { 
    int i = 0; 
    int len; 

    while((inputs[i]) != '\0') { 
     ++i; 
    } 
    len = i; 

    for(i=0; i<len; i++) { 
     printf("%d ", *(inputs+i)); 
    } 
    printf("\n"); 

    int sum = 0; 
    printf("input length: %d\n", len); 
    for(i=0; i<len; i++) { 
     sum += *(inputs+i); 
    } 
    double mean = sum/len; 
    return mean; 
} 

#endif 

然後,爲了檢查代碼是否工作正常,我創建了另一個代碼test.c

#include <stdio.h> 
#include "mean.h" 

int main(int argc, char **argv) { 
    int arr[5] = {94, 28, 54, 72, 89}; 
    double meanVal = mean(arr); 

    int arrlen = sizeof(arr)/sizeof(arr[0]); 

    printf("Input length: %d\n", arrlen); 
    printf("Inputs: "); 
    int i; 
    for(i=0; i<5; i++) { 
     printf("%d ", *(arr+i)); 
    } 
    printf("\n"); 
    printf("Mean: %lf\n", meanVal); 
    return 0; 
} 

當我編譯和運行代碼,它表現出一個非常奇怪的結果,這樣的..

94 28 54 72 89 32767 2123416711 352349365 1594502056 32767 -1876691539 32767 -1876691539 32767 
input length: 14 
Input length: 5 
Inputs: 94 28 54 72 89 
Mean: 22644032.000000 

前五個要素都沒有問題打印出來,但我仍然想不通的地方接下來的另外9個元素來自於。我相信這可能是這個代碼片段不合適。

while((inputs[i]) != '\0') { 
     ++i; 
    } 

在這種情況下,我該如何修改這個以便用指針變量參數來計算數組長度?

+3

「我認爲可能是這段代碼片段不合適。」你是對的。你原來的'arr'中究竟有一個'\ 0'字符? – kaylum

+0

@kaylum我認爲null表示數組的末尾。如果這是一個錯誤的方法,我應該如何指示數組的結束?我已經嘗試過使用NULL來代替,但事實證明這是錯誤的,在控制檯上打印的消息說'指針和整數('int'和'void *')之間的比較'。 – MarshallLee

+1

不,沒有這樣的一般規則,C中的數組會自動被任何值終止。 C字符串確實被定義爲以'\ 0'結尾,但是它特定於字符串而不是數組。由您決定如何標記數組的末尾。您可以使用不是有效數據值的標記值(例如,0或-1),但是你需要明確地設置(實際上0可以隱式設置,但現在會離開)。另一個常見的習慣是將數組大小傳遞給函數。 – kaylum

回答

0

It's been pointed out in the comments C數組不會自動終止。你必須自己做。

不幸的是,這種技術不適用於你正在做的事情。在一個整數數組中,null與0無法區分。您的mean函數將無法取其中包含0的任何數據。相反,它會認爲列表已完成。

還有其他技術可以解決這個問題。首先是讓調用者傳遞數組的長度。這是main的工作原理。 int main(int argc, char *argv[])。正如你可以想象的那樣,這很不方便且容易出錯。

更好的方法是使用浮點數或雙精度數組。這些允許一些特殊值,如INFINITYNAN(不是數字)。您可以使用NAN作爲陣列終結符,並使用isnan進行檢查。

for(i = 0; !isnan(inputs[i]); i++) { 
    printf("%.2lf ", inputs[i]); 
} 
printf("\n"); 

除此之外,你會聲明一個結構,它可以記住它的長度。

struct { 
    int *array; 
    size_t length; 
}; 

然後,你必須記住保持length始終保持最新狀態。而不是沿着那個兔子洞走,最好使用一個預先存在的C庫來提供這個,比如Gnome Lib。它爲C提供了各種缺失的部分,包括arrays that remember their size and can grow automatically

#include <stdio.h> 
#include <glib.h> 

double mean(GArray *nums) { 
    int i = 0; 

    int sum = 0; 
    for(i = 0; i < nums->len; i++) { 
     sum += g_array_index(nums, int, i); 
    } 

    return sum/nums->len; 
} 

int main(int argc, char **argv) { 
    int _nums[] = {94, 28, 54, 72, 89}; 
    GArray *nums = g_array_new(FALSE, FALSE, sizeof(int)); 
    g_array_append_vals(nums, _nums, 5); 

    double meanVal = mean(nums); 

    int i; 
    for(i = 0; i < nums->len; i++) { 
     printf("%d ", g_array_index(nums, int, i)); 
    } 
    printf("\n"); 
    printf("Mean: %.2lf\n", meanVal); 

    g_array_free(nums, TRUE); 

    return 0; 
}