C scanf函数返回的元素太多

C scanf函数返回的元素太多,c,scanf,C,Scanf,我有以下代码: 最后0个,从< P> C++中的+[a+c]最后一次增加C,所以在你输入n个元素之后,C++=n+1。这就是为什么您的代码显示为8 els。当您输入7个元素时。A[C 1 ]=A(7)恰好为零。< P> C++中的+[C++ ]最后一次增加C,所以在你输入n个元素之后,c==n+1。这就是为什么您的代码显示为8 els。当您输入7个元素时。a[c-1]==a[7]恰好为零。当scanf返回0时,您仍然会增加c。下一次,而不是一行。。拆开你的行,用调试器告诉你发生了什么。在这种情况

我有以下代码:


最后0个,从

< P> C++中的+[a+c]最后一次增加C,所以在你输入n个元素之后,C++=n+1。这就是为什么您的代码显示为8 els。当您输入7个元素时。A[C 1 ]=A(7)恰好为零。

< P> C++中的+[C++ ]最后一次增加C,所以在你输入n个元素之后,c==n+1。这就是为什么您的代码显示为8 els。当您输入7个元素时。a[c-1]==a[7]恰好为零。

当scanf返回0时,您仍然会增加c。下一次,而不是一行。。拆开你的行,用调试器告诉你发生了什么。在这种情况下,在将scanf的结果与1进行比较之前,您需要为其分配一个变量。@WhozCraig,这不是printF@Serge德普。谢谢。关于您的问题,当c<50&&scanf%d时,a+c==1++c;似乎是对的。无论如何,对我来说,阅读和理解起来更清晰。当scanf返回0时,您仍然会增加c。下次,而不是一行。。拆开你的行,用调试器告诉你发生了什么。在这种情况下,在将scanf的结果与1进行比较之前,您需要为其分配一个变量。@WhozCraig,这不是printF@Serge德普。谢谢。关于您的问题,当c<50&&scanf%d时,a+c==1++c;似乎是对的。无论如何,对我来说,阅读和理解起来更清晰。如何优雅地修复你可以在循环结束后简单地减少c,如果c!=0@ForceBru:c保证增加一次,因此我认为可以无条件地减少。或者,将c初始化为-1,并让循环执行&a[++c],这样增量总是带您到(而不是超过)要写入的索引,因为c是有符号的,所以不要切换到大小\u t或其他什么。更简单的是:在扫描%d时重写循环,&a[c++]==1;当Chanf %d,a [c]=1 C++;因此,c只有在成功使用时才会递增。更好的是:C<50 & & ScFF %D,A[C]=1 C++;为了避免数组溢出。@Serge:如果a的大小发生变化,sizeof方法可以确保只要它仍然是一个真正的数组,而不是一个指针,您就仍然遵守它的边界;一个硬编码的50将需要修改以匹配。如何优雅地修复如果c=0@ForceBru:c保证增加一次,因此我认为可以无条件地减少。或者,将c初始化为-1,并让循环执行&a[++c],这样增量总是带您到(而不是超过)要写入的索引,因为c是有符号的,所以不要切换到大小\u t或其他什么。更简单的是:在扫描%d时重写循环,&a[c++]==1;当Chanf %d,a [c]=1 C++;因此,c只有在成功使用时才会递增。更好的是:C<50 & & ScFF %D,A[C]=1 C++;为了避免数组溢出。@Serge:如果a的大小发生变化,sizeof方法可以确保只要它仍然是一个真正的数组,而不是一个指针,您就仍然遵守它的边界;硬编码的50将需要修改以匹配。
#include <stdio.h>

void print(char* m, int* a, int c){
    printf("%s (%d els.)\n", m, c);
    for(int i = 0; i < c; i++)
        printf("%d ", a[i]);
    printf("\n");       
}

int main(void) {
    int c = 0;
    int a[50];
    
    while(scanf("%d", &a[c++]) == 1);
    
    print("Init array: ", a, c);
    return 0;
}
Init array:  (8 els.)
5 6 2 1 8 8 1 0