2013-04-17 68 views
2

我試圖在數組中打印整數的摘要。例如,如果用戶鍵入:「1 4 5 8」 結果應該是:「1 5 10 18」(0 + 1 = 1,1 + 4 = 5,5 + 5 = 10,10 + 8 = 18 ) 當我運行此代碼的輸入:「1 1 1」 第一次結果是:「1 2 3 32767 256」 和任何其他時間運行如期:\ 這樣做的算法很簡單,它的工作原理但我習慣了OOP和 剛剛開始學習C.這裏的東西似乎不正確..什麼東西與指針或malloc?任何幫助? 執行此操作的「正確」方式是什麼? 乾杯..!如何在C中打印數組元素的摘要

#include <stdio.h> 
#include <stdlib.h> 
#define MAX 50 

/*function prototype*/ 
int* summary(int a[], int length); 
void printArray(int array[], int i); 

int main(){ 
    int k; 
    int length=0; 
    int userArray[MAX]; 
    printf("Enter some numbers:\n"); 

    while((scanf("%d", &k) ==1)){ 
     userArray[length] = k; 
     length++; 

     /*print the array after 'Enter' key pressed*/ 
     if(getchar() == '\n'){ 
      summary(userArray, length); 
      length = 0; 
      printf("\n"); 
     }/*if*/ 
    }/*while*/ 

    summary(userArray, length); 
    printf("\n"); 

    return 0; 
}/*main*/ 

int* summary(int a[], int length){ 
    int i; 
    int counter = 0; 
    int *p; 
    p = (int *) malloc(length * sizeof(int)); 

    if(!p){ 
     printf("memory allocation failed!"); 
     exit(0); 
    }/*if null*/ 


    for(i=0 ; i<length ; i++){ 
     counter+=a[i]; 
     p[i] = counter; 
    }/*for*/ 

    a[length] = '\0'; 
    printArray(p, 0); 
    return p; 
    free(p); 
}/*summary*/ 

void printArray(int array[], int i){ 
    if(array[i]=='\0'){ 
     printf("finished printing"); 
     return; 
    } 
    else{ 
     printf(" %d\n", array[i]); 
     printArray(array, i+1); 
    } 
}/*printArray*/ 

回答

7

的問題是在線

a[length] = '\0'; 
printArray(p, 0); 

printArray迭代,直到它找到與值0的元素您已嘗試寫入零值超出a結束然後傳遞數組pprintArrayp沒有任何零元這樣printArray繼續閱讀超越它的不可預知的時間,直到它崩潰或與價值發現內存0

爲了解決這個問題,你應該分配空間中plength+1元素然後設置p[length] = 0前呼叫printArray。另外,您也可以在第二個參數更改爲printArray是數組的大小,並重新實現它作爲

void printArray(int* array, int size){ 
    for (int i=0; i<size; i++) { 
     printf(" %d\n", array[i]); 
    } 
    printf("finished printing"); 
}/*prinArray*/ 

您還需要決定如何處理你summary分配爲p內存做。你現在從函數返回這個,然後嘗試到free它。由於前面的return語句將控制權返回給調用函數,所以free(p)行將不會執行。由於summary沒有調用者使用返回值,因此最簡單的修復方法是更改​​summary以返回void並刪除return p行。

請注意,如果您啓用了警告,則最後一個問題應由編譯器標記。 (將gcc的-Wall添加到您的命令行或MSVC的/W4

+0

非常感謝您的快速和高效的響應,您非常幫助我! – Raskanskyz