我正在编写代码将一个数组拆分为 2 个不同的数组,一个包含偶数,一个包含奇数。我从文件中读取数字,将其全部放入一个数组中,然后正确拆分。这是一切正常的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv){
FILE* fpointer;
if (argc >= 2){
fpointer = fopen(argv[1], "r");
}else{
printf("No filename or multiple file names given");
return 0;
}
int numElem;
fscanf (fpointer, "%d\n", &numElem);
printf("Number of elements is %d\n", numElem);
int* arr;
int numEvens;
int numOdds;
arr = (int*) malloc(numElem*sizeof(int));
for (int i = 0; i < numElem; i++){
int temp;
fscanf(fpointer, "%d", &temp);
if(temp%2 == 0){
numEvens++;
}else{
numOdds++;
}
arr[i] = temp;
}
fclose(fpointer);
printf("number of evens: %d \n number of odds: %d\n", numEvens, numOdds);
//The array is now in "arr"
int* evens;
int* odds;
evens = (int*) malloc(numEvens*sizeof(int));
odds = (int*) malloc(numOdds*sizeof(int));
int a = 0;
int b = 0;
for (int i=0; i < numElem; i++){
printf("%d\n", arr[i]);
if (arr[i]%2 == 0){
evens[a] = arr[i];
a++;
}else{
odds[b] = arr[i];
b++;
}
}
printf("EVENS: %d\n", numEvens);
for (int i=0; i < numEvens; i++){
printf("%d\n", evens[i]);
}
printf("ODDS: %d\n", numOdds);
for (int i=0; i < numOdds; i++){
printf("%d\n", odds[i]);
}
现在我有一个整齐的数组,其中包含偶数,一个包含奇数。它正确输出 numEvens 和 numOdds。然后我尝试对其进行排序:
int temp;
int x;
int y;
for (x = 0; x < numEvens-1; x++){
for (y=x+1; y < numEvens; y++){
if (evens[y] < evens[x]){
temp = evens[y];
evens[y] = evens[x];
evens[x] = temp;
}
}
}
return 0;
}
在我添加排序方法之前的输出是:
Number of elements is 8
number of evens: 5
number of odds: 3
25
10
1
99
4
2
8
10
EVENS: 5
10
4
2
8
10
ODDS: 3
25
1
7
新的输出变成:
Number of elements is 8
number of evens: 32772
number of odds: 1764530596
25
10
1
99
4
2
8
10
EVENS: 32772
10
4
2
8
10
0
0
0
0
....
0 大概会再重复 32,000 次,直到我中止。我从 Java 毕业后正在尝试 C 语言,因此内存分配对我来说是一个新主题,但我假设它与此有关。我只是不明白变量在声明和打印后如何通过添加的代码行来更改。我真的不需要新排序方法的帮助,我只是想要一些关于这里发生的事情的指示,这样我就可以修复错误。提前致谢!
最佳答案
int numEvens; int numOdds;
初始化你的变量:
int numEvens = 0;
int numOdds = 0;
...并且不要转换 malloc()
的结果!
关于c - C 中的变量意外更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52547411/