这是第一步:
for (i = 0; i < 25; ++i) e[i] = o[i] = 9999;
然后你会发现有9999 值散布在两个最终数组中。
至于为什么,请考虑序列7, 8。七个进入a[0],然后,奇怪的是,也进入o[0]。
八个进入a[1],然后,甚至,也进入e[1],留下e[0]在这一步之前保持它具有的任意值。那是因为您对所有三个数组访问都使用了i:
index: 0 1 2 3 ...
-----------------------
e: ? 8 ? ? ...
o: 7 ? ? ? ...
你最好做的是保持三个单独的计数。事实上,two 就可以了,因为在输入数字被发送到正确的数组后,您再也不需要再次使用它了。这意味着a[] 是不必要的。
例如(并特别注意较长的变量名称,当您稍后查看代码时,这将变得非常宝贵,或者其他人必须这样做):
int value, oddIdx = 0, evenIdx = 0;
for (int i = 0; i < 20; ++i) {
if (fscanf(fp, "%d", &value) != 1) // should handle invalid data.
;
if (value % 2 == 0) {
evens[evenIdx++] = value;
} else {
odds[oddIdx++] = value;
}
还要注意该代码中简化的奇偶校验。我不确定为什么您认为您必须将 -1, 0, 1 视为原始代码中的特殊情况,但它们工作得很好。
然后打印它们(此处为标准输出,但在您的情况下为文件):
for (int i = 0; i < oddIdx; ++i)
printf("Odd : %d\n", odds[i]);
for (int i = 0; i < evenIdx; ++i)
printf("Even: %d\n", evens[i]);
最后一点,您甚至不需要 任何 数组,因为一旦您将数字写入正确的文件(并且您可以在阅读后立即执行此操作)它),你可以把它扔掉。
这样做,处理错误并允许任何输入大小,最终会得到这样的程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
// Open all files, cleaning up on failure
// (fail fast strategy).
FILE *fileIn, *fileEven, *fileOdd;
if ((fileIn = fopen("number.txt", "r")) == NULL) {
fprintf(stderr, "Cannot open input file.");
return -1;
}
if ((fileEven = fopen("even.txt", "w")) == NULL) {
fprintf(stderr, "Cannot create even file.");
fclose(fileIn);
return -1;
}
if ((fileOdd = fopen("odd.txt", "w")) == NULL) {
fprintf(stderr, "Cannot create odd file.");
fclose(fileIn);
fclose(fileEven);
return -1;
}
// All open now, start processing input of any
// size, stop when no numbers left (end of
// file, or invalid number).
while (fscanf(fileIn, "%d", &value) == 1) {
// Allocate to odd or even file.
if (value % 2 == 0) {
fprintf(fileEven, "%d ", value);
} else {
fprintf(fileOdd, "%d ", value);
}
// Or could be "clever" with:
// fprintf((value % 2 == 0) ? fileEven : fileOdd, "%d ", value);
}
// Put newline at end of output files, just to be
// nice, then close all files and exit.
fputc('\n', fileEven);
fputc('\n', fileOdd);
fclose(fileIn);
fclose(fileEven);
fclose(fileOdd);
return 0;
}
并且请(如果这是课堂作业)使用此代码来教育自己,而不是尝试将其作为自己的代码传递出去。假设您的教育工作者不检查抄袭,您将是愚蠢的。