2

重複の可能性:
ANSI C を使用した動的配列

ユーザーが入力している値で配列を埋めようとしています。ただし、配列に含まれる値の数、またはユーザーが入力する値の数は事前にわかりません。ユーザーが一度に値を入力すると、値が配列に格納され、ユーザーは再び負の数を入力するまで、別の値を入力するように求められます。ユーザーが負の数を入力すると、プログラムはユーザーがそれまでに入力したすべての正の値を出力します (基本的にプログラムの終了にのみ使用されるため、負の値ではありません)。

私の問題は次のとおりです。

1)配列の大きさを事前に知らずに配列を宣言する方法は?

2) ユーザー入力をスキャンする方法は? たとえば、入力をスキャンして値を配列に割り当てるために、このようなことを考えています (これはコードの一部であり、すべてではありません。コードのこの部分が機能するかどうかを知りたいだけです。プログラムを完了しました):

...

int working = 0;
int i = 0;
do
{          
printf("Enter a positive value \n");
scanf("%d",&x);
if (x >= 0)
{
 &array[i] = x;
 i++;
}
else
{
 printf("You have entered a negative number \n");
 working = 1;
}
} while (working = 0);

このコードは正しいですか (もちろん、完全なプログラムではありません)。また、どのくらいの大きさになるかを知らずに配列を宣言するにはどうすればよいですか (ユーザーが負の値を入力する前に入力する正の値の数を事前に知る方法はありません)。

4

5 に答える 5

3

ユーザー入力用に初期配列を割り当て、そのサイズを変数に保存して、配列がいっぱいになったときに配列を再割り当てできるようにすることができます。または、リンクリストを使用して入力を保存し、後で必要な要素数を計算して配列を割り当てることができます。

于 2012-12-20T09:43:33.223 に答える
2
int arraySize = 256; // Or whatever
int *array = malloc(arraySize * sizeof(int));
if (!array)
{
    fprintf(stderr, "Master, please buy more RAM, I can't allocate memory\n");
    return;
}

int numberOfElements = 0;
for(;;)
{          
    printf("Enter a positive value:\n");
    scanf("%d",&x);

    if (x >= 0)
    {
        if (numberOfElements == arraySize)
        {
            arraySize *= 2; // Or whatever strategy you need
            array = realloc(array, arraySize * sizeof(int));
            if (!array)
            {
                fprintf(stderr, "Master, please buy more RAM, I can't allocate memory\n");
                break;
            }
        }
        array[numberOfElements++] = x;
    }
    else
    {
        printf("You have entered a negative number \n");
        break;
    }
}

何かのようなもの。間違いの可能性があることをお詫びします。チェックしないでください。

于 2012-12-20T09:52:07.183 に答える
1

リンクリストを使用する方がよいでしょう。配列はここでは役に立ちません。

あなたがそれに精通していない場合はこれをチェックしてください-http://cslibrary.stanford.edu/103/LinkedListBasics.pdf

于 2012-12-20T09:43:33.310 に答える
1
   int dataarray [2];
   int no;
   int count =0;

   while(1)
   {
        printf("Enter No's = ");
        scanf("%d",&no);
        if(no<0)
             break;
       *(dataarray+count)=no;
       count++;
   }

さらにカウントを使用して、配列内の要素の数を知ることができます。

ポインタリンクによってこの配列から要素を取得できます

no = *(dataarray+count)
于 2012-12-20T10:14:08.783 に答える
1

そのために、リンクされたリスト構造を使用できます。グーグルで検索すると、これに関する多くのページを見つけることができます。以下に例を示します (必ずしも最適化された形式ではありませんが、アイデアを提供するためのものです)。

#include <stdio.h>
#include <stdlib.h>

struct datalist
{
    int value;
    struct datalist *next;
};
typedef struct datalist *linkedList;


void addToList(linkedList *param_valueList, const int param_newValue)
{
    if (*param_valueList == NULL)
    {
        linkedList newItem = (linkedList)malloc(sizeof(struct datalist));
        newItem->value = param_newValue;
        newItem->next = NULL;
        *param_valueList = (linkedList)malloc(sizeof(linkedList));
        *param_valueList = newItem;
    }
    else
    {
        linkedList newList = (linkedList)malloc(sizeof(struct datalist));
        newList->value = param_newValue;
        newList->next = NULL;

        linkedList tmpList = *param_valueList;
        while (tmpList->next != NULL)
            tmpList = tmpList->next;
        linkedList *listPtr = &tmpList;
        (*listPtr)->next =  newList;
   }
}


void printList(const linkedList param_valueList)
{
    linkedList tmpList = param_valueList;
    while (tmpList != NULL)
    {
        printf("%d\n", tmpList->value);
        tmpList = tmpList->next;
    }
 }


int main(int argc, char *argv[])
{
    int inputNmbr = 0;
    linkedList numberList = NULL;
    while (1)
    {
        printf("print a number: ");
        scanf("%d", &inputNmbr);
        if (inputNmbr > 0)
            addToList(&numberList, inputNmbr);
        else
            break;
    }

    printf("Here are the numbers you entered:\n");
    printList(numberList);

    return 0;
}

よろしく、

于 2012-12-20T10:40:30.427 に答える