user-0 提问: 关于C语言scanf的问题

回复:
user: user-1
content: 引用 6 楼 Dream1018 lin 的回复:[quote=引用 1 楼 qzjhjxj 的回复:]供参考：#include <stdio.h>  int main() {       int a[100],i=0,j;       while ((scanf("%d",&a[i++])==1)&&((getchar())!='\n'));      //方法一：以回车作为结束符，最后回车前面不能有空格       //while (scanf("%d",&a[i])==1 && a[i]!=0){i++;}      //方法二：以0或其他数字作为结束符，结束输入       for (j=0;j<i;j++)           printf("%d ",a[j]);            return 0; } 您好，我有点不太理解这样做的含义，我尝试把代码进行如下修改： int main() {      int a[100],i=0,j;     char m;     while ((scanf("%d",&a[i++])==1)&&((m=getchar())!='\n'))     {         printf("%d,%c\n",a[i-1],m);     }     for (j=0; j<i; j++)         printf("%d ",a[j]);      return 0; } 输入为：1 2 3 4 5(回车) 输出为： 1, 2, 3, 4,    (注意，5是没有被输出的) 1 2 3 4 5  我有疑问的点在于scanf与getchar()是同时工作的?还是说有先把数读给scanf，再读给getchar()? 我的假设是scanf每次进行输出的同时,会将读取到的数字同时作为字符的形式传给getchar(), 然后将每次getchar()读取到的字符给打印出来，但是却没有结果，对这里的getchar()的工作方式不太理解， 尤其是最后边'5,'并没有被打印出来，这又是为什么？还请指点。[/quote] 将上面的写法换种表达，方便对while（）的理解，两个函数的详细用法可以参考网上的资料，以下供参考：#include <stdio.h> int main() {      int a[100],i=0,j;     char m;     while (1)     {         if(scanf("%d",&a[i++])!=1) break;         printf("a[%d]=%d\n",i-1,a[i-1]);         if((m=getchar()) == '\n')  break;     }     for (j=0; j<i; j++)         printf("%d ",a[j]);          return 0; }  //用scanf输入数值类型（int、float、double等） //空格、回车、Tab键不会中断输入，scanf从第一个非空格/回车数值开始录入，即不管中间有多少空格有多少回车， //都不会中断scanf的录入，除非到达scanf中规定的录入数量或遇到非数值类型时scanf("%d",&a[i++])!=1条件成立。  //getchar //getchar()主要用来接收单个字符，不管是空格或者回车都可以接收。

user: user-0
content: 引用 1 楼 qzjhjxj 的回复:供参考：#include <stdio.h>  int main() {       int a[100],i=0,j;       while ((scanf("%d",&a[i++])==1)&&((getchar())!='\n'));      //方法一：以回车作为结束符，最后回车前面不能有空格       //while (scanf("%d",&a[i])==1 && a[i]!=0){i++;}      //方法二：以0或其他数字作为结束符，结束输入       for (j=0;j<i;j++)           printf("%d ",a[j]);            return 0; } 您好，我有点不太理解这样做的含义，我尝试把代码进行如下修改： int main() {      int a[100],i=0,j;     char m;     while ((scanf("%d",&a[i++])==1)&&((m=getchar())!='\n'))     {         printf("%d,%c\n",a[i-1],m);     }     for (j=0; j<i; j++)         printf("%d ",a[j]);      return 0; } 输入为：1 2 3 4 5(回车) 输出为： 1, 2, 3, 4,    (注意，5是没有被输出的) 1 2 3 4 5  我有疑问的点在于scanf与getchar()是同时工作的?还是说有先把数读给scanf，再读给getchar()? 我的假设是scanf每次进行输出的同时,会将读取到的数字同时作为字符的形式传给getchar(), 然后将每次getchar()读取到的字符给打印出来，但是却没有结果，对这里的getchar()的工作方式不太理解， 尤其是最后边'5,'并没有被打印出来，这又是为什么？还请指点。

user: user-2
content: 引用 1 楼 qzjhjxj 的回复:供参考：#include <stdio.h>  int main() {       int a[100],i=0,j;       while ((scanf("%d",&a[i++])==1)&&((getchar())!='\n'));      //方法一：以回车作为结束符，最后回车前面不能有空格       //while (scanf("%d",&a[i])==1 && a[i]!=0){i++;}      //方法二：以0或其他数字作为结束符，结束输入       for (j=0;j<i;j++)           printf("%d ",a[j]);            return 0; } 注意考虑一下数组越界～

user: user-2
content: EOF确实是以ctrl+z（Windows）或ctrl+d（Linux）输入的。  int  i=0; while(scanf("%d",a[i])!=EOF) {     i++; } 这样是可以的，但是不能无限输入呢，因为i要注意不要越界呢。所以可以加一下限制条件：   int  i=0; while(i < MAX_ARRAY_SIZE && scanf("%d",a[i])!=EOF)    //MAX_ARRAY_SIZE自己定义长度，这个是数组的长度 {     i++; } 供参考～

user: user-0
content: 谢谢，想问一下，程序每次从输入中读取时scanf和getchar是同时进行的吗，意思是：  引用 2 楼 自信男孩 的回复:EOF确实是以ctrl+z（Windows）或ctrl+d（Linux）输入的。  int  i=0; while(scanf("%d",a[i])!=EOF) {     i++; } 这样是可以的，但是不能无限输入呢，因为i要注意不要越界呢。所以可以加一下限制条件：   int  i=0; while(i < MAX_ARRAY_SIZE && scanf("%d",a[i])!=EOF)    //MAX_ARRAY_SIZE自己定义长度，这个是数组的长度 {     i++; } 供参考～ 谢谢！

user: user-1
content: 供参考：#include <stdio.h>  int main() {       int a[100],i=0,j;       while ((scanf("%d",&a[i++])==1)&&((getchar())!='\n'));      //方法一：以回车作为结束符，最后回车前面不能有空格       //while (scanf("%d",&a[i])==1 && a[i]!=0){i++;}      //方法二：以0或其他数字作为结束符，结束输入       for (j=0;j<i;j++)           printf("%d ",a[j]);            return 0; }