scanf输入及其他问题

Scanf input & other questions

我有一个具有以下目标的程序:

  1. 将输入读入数组

  2. 读到 EOF

  3. 记录成功(数字)输入的次数

我从初始化开始:

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;
    }
}
  1. num_inputs 不起作用。从调试(或者我对调试知之甚少),num_input 从 0 到某个随机数。我究竟做错了什么?有指针的东西?

  2. 假设我输入 5 9 8 8 3 4 - scanf 会将其解释为 6 个输入吗? num_input 会是 6 吗?如果没有,我该如何实现?我希望能够编写 5 6 3 6 换行符 4 9 3 并且程序能够将其解释为将 7 个东西写入数组并且 num_input 为 7.

提前致谢。

这一行有问题:

    *num_inputs++;

它引用 returns 值,然后递增指针,但 pointee 根本不递增。由于指针递增,它有效地调用了 undefined behaviour

这就是为什么编写 可读 代码总是更好的原因,这样您就不必担心优先级问题。 使用一个局部变量,并在循环中用它自增,最后赋值给*num_inputs.

int count = 0;

while( scanf("%d", &array[i]) != EOF ) {
        i++;
        count++;
        if (i == (size-1))
            break;
}

*num_inputs = count;
  1. 正如@BlueMoon已经提到的,这是因为你正在递增指针num_inputs。不是指点对象 *num_inputs.

    因此,将 *num_inputs++; 更改为 (*num_inputs)++;(或使用局部变量,谢谢 @BlueMoon)。

  2. 是的。进行上述更改后,您将获得两种情况所需的输出。

运行 并检查下面的代码:

#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;
}