Scanf输入&其他问题

时间:2015-12-04 10:36:17

标签: c arrays scanf eof

我有一个有这些目标的计划:

  1. 将输入读入数组

  2. 阅读直至EOF

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

  4. 我从初始化开始:

    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 Newline 4 9 3以及能够将其解释为将7个内容写入数组并且num_input为7的程序。

    3. 提前致谢。

2 个答案:

答案 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)

  1. 正如@BlueMoon所述,这是因为您正在递增指针num_inputs。不是指针*num_inputs

    所以,将*num_inputs++;更改为(*num_inputs)++;(或使用本地变量,感谢@BlueMoon)。

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

  3. 运行并检查以下代码:

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