我有一个有这些目标的计划:
将输入读入数组
阅读直至EOF
记录成功(数字)输入的数量
我从初始化开始:
int array[200];
int size = sizeof(array)/sizeof(int);
int num_inputs = 0;
然后我调用函数void input(int * array, int size, int *num_inputs)
input(array, size, &num_inputs);
_
void input(int * array, int size, int *num_inputs) {
int i = 0;
printf("Enter numbers:\n");
while( scanf("%d", &array[i]) != EOF ) {
i++;
*num_inputs++;
if (i == (size-1))
break;
}
}
num_inputs不起作用。从调试(或者我对调试知之甚少),num_input从0变为某个随机数。我究竟做错了什么?有指针的东西?
假设我输入5 9 8 8 3 4
- scanf会将其解释为6个输入吗? num_input会是6吗?如果没有,我该如何实现?我希望能够编写5 6 3 6
Newline 4 9 3
以及能够将其解释为将7个内容写入数组并且num_input为7的程序。
提前致谢。
答案 0 :(得分:1)
问题在于这一行:
*num_inputs++;
它会引用并返回值,然后递增指针,但指针根本不会递增。由于指针递增,它会有效地调用undefined behaviour。
这就是编写可读代码总是更好的原因,这样您就不必担心优先级了。
使用局部变量并使用它在循环中递增,最后将其分配给*num_inputs
。
int count = 0;
while( scanf("%d", &array[i]) != EOF ) {
i++;
count++;
if (i == (size-1))
break;
}
*num_inputs = count;
答案 1 :(得分:1)
正如@BlueMoon所述,这是因为您正在递增指针num_inputs
。不是指针*num_inputs
。
所以,将*num_inputs++;
更改为(*num_inputs)++;
(或使用本地变量,感谢@BlueMoon)。
是。完成上述更改后,您将获得两种情况所需的输出。
运行并检查以下代码:
#include <stdio.h>
void input(int * array, int size, int *num_inputs) {
int i = 0;
printf("Enter numbers:\n");
while( scanf("%d", &array[i]) != EOF ) {
i++;
(*num_inputs)++;
if (i == (size-1))
break;
}
}
int main() {
int array[200];
int size = sizeof(array)/sizeof(int);
int num_inputs = 0;
input(array, size, &num_inputs);
printf("num_inputs: %d\n",num_inputs);
return 0;
}