动态数组:使用C将数字分为偶数和奇数

时间:2019-05-22 03:19:44

标签: c dynamic-arrays

我的程序应该首先要求读取整数,然后动态分配一个数组,该数组的大小足以容纳我读取的值的数量。然后,我需要将这些值分为奇数和偶数。

这是我尝试过的代码

#include <stdio.h> 
#include <stdlib.h>
int main(void){

//declare variables
int i; //loop counter
int count; //integer amount from user
int j = 0; int k = 0;

// read in integer count from user
printf("enter the amount of numbers: ");
scanf("%d", &count);

// declare pointer 
int *number = malloc(sizeof(int)*count);
int *evens = malloc(sizeof(int)*count);
int *odds = malloc(sizeof(int)*count);

// declare variable
//int odds_count = 0;
//int evens_count = 0;

//loop to read in numbers from user
for (i=0; i<count; i++){
    printf("enter number %02d: ",i+1);
    scanf("%d",(number+i));
    printf("you entered %d\n", *(number+i)); //--- entered values are correct here
    if (*(number+i)% 2 ==0){
        *(number+i) = *(evens+j);
        j++;
        //evens_count++;
    } else {
        *(number+i) = *(odds+k);
        k++;
    }
    printf("you entered %d\n", *(number+i));  //---entered values become 0
}
//print array elements
printf("\nEntered array elements are:\n");
for(i=count;i>0;i--)
{
    printf("%d ",*(number+i));
}
printf("\n");

// print out even numbers
printf("even numbers: ");
for (i=0;i<j;i++){
    printf("%5d",*(evens+i));
}
printf("\n");

// print out odd numbers
printf("odd numbers: ");
for (i=0;i<k;i++){
    printf("%5d",*(odds+i));
}
printf("\n");

return 0;
}

无论我输入什么输入,输出仅显示0。 例如:

Input- 1, 2, 3
Output-
Evens: 0
Odds: 0 0

请帮助我。预先感谢!

2 个答案:

答案 0 :(得分:0)

从用户那里获取输入时,请尝试在变量名前添加“&”符号。我认为应该可以。

scanf("%d",&(number+i));

快乐编码:)

答案 1 :(得分:0)

当您尝试在evens[j]odds[j]的元素之前尝试将numbers[i]evens分配给odds时,会遇到有关分配值的最大问题。初始化。在为每个mallocevens调用odds之后,分配的内存块包含分配时恰好在该内存区域中的任何垃圾值。 malloc不会以任何方式初始化内存的内容并使值不确定。如果要分配所有字节并将其全部归零,则可以使用calloc代替malloc

此问题发生在这里:

    if (*(number+i)% 2 ==0){
        *(number+i) = *(evens+j);
        j++;
        //evens_count++;
    } else {
        *(number+i) = *(odds+k);
        k++;
    }

请仔细检查,检查numbers[i]是否与% 2 == 0偶数/奇数,然后尝试用numbers[i]或{{1}覆盖evens[j]上的值}-这倒退了。目的是将odds[k]中的值分配给numbers[i]evens[j],例如

odds[k]

接下来,您对变量的使用混乱了。您不需要在 if (number[i] % 2 ==0){ evens[j] = number[i]; j++; //evens_count++; } else { odds[k] = number[i]; k++; } 的开头声明所有不同的i, j, k计数器。从C99开始,在过去的20年中,您可以在main()循环声明本身中声明循环变量。这样就消除了循环变量的使用与程序中其他地方for的另一种使用冲突的可能性。

您有i, j, k,这是您唯一需要的计数器。

此外,您需要验证每个用户输入和每个分配。否则,您可能会轻击按键或在分配(如果不是“ if”的情况下)返回count, odd_count & even_count时调用未定义行为。验证每个关键步骤。

通过使用这些措施,可以将声明简化为:

NULL

您可以使用以下方法验证您的输入:

    int count,          /* integer amount from user     */
        odd_count = 0,  /* odd count (initialized zero) */
        even_count = 0, /* even count (initialized zero)*/
        *number,        /* declare pointers             */
        *evens,
        *odds; 

您可以验证您的分配:

    /* read in integer count from user (VALIDATE every input) */
    printf("enter the amount of numbers: ");
    if (scanf("%d", &count) != 1) {
        fputs ("error: invalid integer input.\n", stderr);
        return 1;
    }
    ...
    for (int i = 0; i < count; i++) {   /* loop count times for input */
        printf ("enter number %2d: ", i + 1);
        if (scanf ("%d", &number[i]) != 1) {    /* validate EVERY input */
            fputs ("error: invalid integer input.\n", stderr);
            return 1;
        }
        if (number[i] % 2 == 0)     /* assign, increment evens count */
            evens[even_count++] = number[i];
        else                        /* same for odds */
            odds[odd_count++] = number[i];
    }

然后,只需循环 /* allocate count integers each pointer (VALIDATE every allocation) */ if ((number = malloc (count * sizeof *number)) == NULL) { perror ("malloc-number"); return 1; } if ((evens = malloc (count * sizeof *evens)) == NULL) { perror ("malloc-evens"); return 1; } if ((odds = malloc (count * sizeof *odds)) == NULL) { perror ("malloc-odds"); return 1; } 来输出i = 0; i < countnumber来输出i = 0; i < even_count,最后是evens来输出{{1} },例如

i = 0; i < odd_count

最后,您可以使用以下命令一次输出所有3个数组:

odds

最后,不要忘记释放分配的内存,例如

    puts ("\n numbers\n--------");      /* output each array on its own */
    for (int i = 0; i < count; i++)
        printf ("%8d\n", number[i]);

    puts ("\n   evens\n--------");
    for (int i = 0; i < even_count; i++)
        printf ("%8d\n", evens[i]);

    puts ("\n    odds\n--------");
    for (int i = 0; i < odd_count; i++)
        printf ("%8d\n", odds[i]);

完全将其放入,您可以这样做:

    /* output all arrays together */
    puts ("\nnumbers      even      odd\n-------- -------- --------");
    for (int i = 0; i < count; i++) {       /* loop printing number */
        printf ("%8d", number[i]);
        if (i < even_count) {               /* if i < even_count */
            printf (" %8d", evens[i]);      /* output evens */
            if (i < odd_count)              /* if odds too, output them */
                printf (" %8d\n", odds[i]);
            else
                putchar ('\n');             /* no more odds output '\n' */
        }
        else if (i < odd_count)             /* if only odds left, output */
            printf ("%18d\n", odds[i]);
        else
            putchar ('\n');
    }

使用/输出示例

    free (number);  /* don't forget to free what you allocated */
    free (evens);
    free (odds);

仔细检查一下,如果还有其他问题,请告诉我。