我的程序应该首先要求读取整数,然后动态分配一个数组,该数组的大小足以容纳我读取的值的数量。然后,我需要将这些值分为奇数和偶数。
这是我尝试过的代码
#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
请帮助我。预先感谢!
答案 0 :(得分:0)
从用户那里获取输入时,请尝试在变量名前添加“&”符号。我认为应该可以。
scanf("%d",&(number+i));
快乐编码:)
答案 1 :(得分:0)
当您尝试在evens[j]
或odds[j]
的元素之前尝试将numbers[i]
和evens
分配给odds
时,会遇到有关分配值的最大问题。初始化。在为每个malloc
和evens
调用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 < count
,number
来输出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);
仔细检查一下,如果还有其他问题,请告诉我。