我有这段代码:
int main() {
int array[5];
int x;
int n;
for(x = 0; x != 5; x++) {
scanf("%d", &n);
if(n % 2 == 0) {
array[x] = n;
}
printf("%d", sizeof(array))
我想知道数组中保存了多少变量。
鉴于用户已输入" 2,3,5,6,7,8"并且它只会得到" 2,6,8",有什么方法可以达到它的大小吗?
我能做到这一点的另一种方法是制作另一个int:
int main() {
int array[5];
int x;
int g = 0;
int n;
for(x = 0; x != 5; x++) {
scanf("%d", &n);
if(n % 2 == 0) {
array[x] = n;
g++;
}
printf("%d", g);
如果不在if块内增加g
,有没有办法做到这一点?
答案 0 :(得分:1)
您必须跟踪计数,否则您将不知道要为阵列使用什么索引。您当前的代码不起作用,因为您在偶数之间的数组中留下了空白:
for (x = 0; x != 5; x++) {
scanf("%d", &n);
if (n % 2 == 0) {
array[x] = n;
g++;
}
对于输入“2 3 5 6 7”,您将数字2存储在阵列中的位置0,将数字6存储在位置3.在其他位置存在随机数据。它们甚至不是零值,因为您在函数内声明了数组。顺便说一下,固定大小的数组应该在全局范围内声明,在任何函数之外。那是因为函数内部的变量被分配在堆栈帧中,这是一个小而瞬态的内存。你希望你的数组在堆上,这是一个大而长寿的。
以下代码包含几项改进。它定义了数组长度的常量,并在保存数字之前检查当前计数。 (如果您在数组末尾写入,则会发生错误。)此外,此代码对其将读取的数据量没有固定限制。它一直调用scanf
,直到返回文件结束值EOF
。
#include <stdio.h>
#include <stdlib.h>
#define MAX_COUNT 1000
int even[MAX_COUNT];
int main() {
int x,
count = 0; /* Track the number of even numbers. */
while (scanf("%d", &x) != EOF) { /* Get an integer from standard input. */
if(x % 2 == 0) { /* Is it even? */
if (count == MAX_COUNT) { /* If so, check the count first. */
printf("I have reached the limit of %d! I cannot store %d.",
MAX_COUNT, x); /* Fail gracefully if the array is */
} else { /* full. Otherwise, we can go */
even[count++] = x; /* ahead and save the number. */
}
}
}
printf("There are %d even numbers.\n", count);
return 0;
}
答案 1 :(得分:0)
你需要自己跟踪这个。
也许通过使用一个额外的变量(如你在第二个例子中所示),或者使用一个你可以计算的标记值(比如我们如何在字符串中使用空字符)