2016-09-22 10 views
0

この小さなCプログラムを使用して配列を塗りつぶし、要素を配列から挿入して削除し、最後にその配列を出力します。配列に要素を追加して削除する

プログラムは、main()関数、addToArray()関数、 remFromArray()関数、およびprintArray()関数で構成されています。

ここに私の主な方法です: ユーザーが入力した各整数について正の整数

•一連のためにユーザを促し、配列

•コールに整数を挿入するためにaddToArray関数を呼び出すには配列の内容を出力するprintArray関数

注:入力する整数の数を入力するようにユーザーに求めないでください。

addToArray()=>

/*find the correct index in the array where to insert the 
    new element, so array in ascending order 
    - make room for the new element by moving other elements 
    - store the new element at the correct index 
    - return the new size (number of elements) of the array */ 

int addToArray(int* arr, int size, int numToAdd){ 
int i, n, m, pos; 

    for (int i = 0; i < maxSize; i++) 
    { 
     if (numToAdd < arr[i]) 
     { 
      pos = i; 
      break; 
     } 
     if (numToAdd > arr[n-1]) 
     { 
      pos = maxSize; 
      break; 
     } 
    } 
    if (pos != maxSize) 
    { 
     m = maxSize - pos + 1 ; 
     for (int i = 0; i <= m; i++) 
     { 
      arr[maxSize - i + 2] = arr[maxSize - i + 1] ; 
     } 
    } 
    arr[pos] = numToAdd; 
} 

void printArray(int* arr, int size){ 

    printf("Resultant array is\n"); 

    for (int c = 0; c <= maxSize; c++){ 
     printf("%d\n", arr[c]); 
    } 
} 

として:ユーザーが負の数を入力するまでは、これらは私が作成した私の他の関数である

#include <stdio.h> 

#define maxSize 100 //maxSize for array 

int addToArray(int* arr, int size, int numToAdd); 
int remFromArray(int* arr, int size, int numToGo); 
void printArray(int* arr, int size); 

int main (void){ 

    int arr[maxSize]; 
    int i, j; 

    printf("Enter a positive integer to add to an array\n"); 
    while (i >= 0){ 

     scanf("%d",&i); 

     if (i >= 0) { 
      addToArray(arr, maxSize, i); 
     printf("Enter another positive integer for array\n"); 

     } 
     else{ 
      printArray(arr, maxSize); 
     } 
    } 
    } 

入力を受け入れる必要があります私はmain()、addToArray()、printArray()を書こうとしましたが、何らかの理由で正しく動作していないことがわかります。私のprintArray()は希望の結果を表示していません。 このコードを見て、私をガイドすることができれば嬉しいです。 ありがとうございます

+2

どうしますか?あなたは何を得ると思いますか? – Pierre

+3

配列を要素で使用する前に配列を初期化しないため、*未定義の動作*があります。配列やそのすべての要素を含むローカルの非静的変数は、明示的に初期化されていなければ、* indeterminate *値を持ちます。配列は、初期化されていない変数だけではありません。配列の範囲外に出るため、未定義の動作もあります。 –

+0

ユーザからの値を読み込む前の 'while()'条件*で 'i'の値をチェックします。これは意味がありません。 – unwind

答えて

3

まず、作成する変数に値を設定しません。たとえば、それらのすべてのint i, n, m, pos;には不確定な値がありますが、期待どおりに0ではありません。悪い驚きを避けるために使用する前に、値を設定することを忘れないでください。

第2に、配列のインデックスについて注意してください。たとえば、arr[maxSize - i + 2]i == 0の場合、インデックスはmaxSize + 2になりますが、魔法使いは無効な位置にあり、セグメンテーション違反につながる可能性があります。

+3

いくつかの点:初期化されていないローカル非静的変数の値は*ランダム*と見えるかもしれませんが、その値をニックすると* indeterminate *になります。また、未定義の振る舞い(境界を越えたときに起こる)は、セグメンテーションフォールトやクラッシュにつながる*がありません。 –

関連する問題