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 回答