2015-12-04 36 views
2

我有了这些目标的程序:SCANF输入和其他问题

  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

在此先感谢。

+3

1)'* num_inputs ++;' - >'++ * num_inputs;'或'(* num_inputs)++;' – BLUEPIXY

+1

注: 'array [199]'没有被使用。我期望'while(i chux

+0

'scanf()'可以返回EOF,但这不是检查的重要标准。而是检查格式字符串中有多少格式说明符被成功输入/转换。对于在发布代码中对'scanf()'的调用,检查的返回值是1,而不是EOF。 – user3629249

回答

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; 
} 
+0

轻微:更好使用while while(scanf(“%d”,&array [i])== 1){'else代码将错误计数应该'scanf(“%d”, &array [i])!= EOF'遇到非数字数据。 – chux

1

问题是这一行:

*num_inputs++; 

它deferences和返回值,然后递增指针,但指针对象完全不增加。由于指针递增,它有效地调用undefined behaviour

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

int count = 0; 

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

*num_inputs = count;