【问题标题】:Scanf input & other questionsScanf输入和其他问题
【发布时间】:2015-12-04 10:36:16
【问题描述】:

我有一个具有以下目标的计划:

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

提前致谢。

【问题讨论】:

  • 1) *num_inputs++; --> ++*num_inputs;(*num_inputs)++;
  • 注意:array[199] 未使用。我希望while(i < size && scanf("%d", &array[i]) == 1) {
  • scanf() 可以返回 EOF 但是,这不是检查的重要标准。而是检查格式字符串中有多少format specifiers 已成功输入/转换。对于发布代码中对scanf() 的调用,要检查的返回值为1,而不是EOF。
  • %d 格式说明符将使用前导 white space,因此在输入中穿插 序列不是问题。
  • 关于这一行:*num_inputs++;,C 中运算符的优先级,具有比 * 取消引用运算符更高级别的 ++ 运算符。要纠正该问题,请使用括号,即 I.E. (*num_inputs)++;

标签: c arrays scanf eof


【解决方案1】:
  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;
}

【讨论】:

  • 次要:最好使用while( scanf("%d", &amp;array[i]) == 1) {,否则如果scanf("%d", &amp;array[i]) != EOF遇到非数字数据,代码将错误计数。
【解决方案2】:

问题出在这一行:

    *num_inputs++;

它遵循并返回值,然后递增指针,但 pointee 根本不递增。由于指针递增,它有效地调用了undefined behaviour

这就是为什么编写可读代码总是更好的原因,这样您就不必担心优先级。 使用局部变量并在循环中使用它来递增,最后将其分配给*num_inputs

int count = 0;

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

*num_inputs = count;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2018-03-05
    • 2018-08-04
    相关资源
    最近更新 更多