C语言中getchar()、gets()和scanf()的特点以及scanf产生的多余回车符问题
来源:互联网 发布:西安软件开发外包公司 编辑:程序博客网 时间:2024/05/21 19:29
第一件事建议大家少用gets函数。
我遇到的这个问题实在是C语言新手比较容易遇到的一个问题。是关于get()和getchar()这两个函数的。大家都知道,gets()函数作用是输入字符串,而getchar()是输入单个字符。但在一个小程序中,我发现了它们两个一些别的用法。
因为源文件的代码很长,所以只打上源文件中涉及到这个问题的一个函数:
void input(num,name){ int num[]; char name[10][8]; int i; for(i=0;i<N;i++) { printf("\n input number :"); scanf("%d",&num[i]); printf("\n intput name"); getchar(); gets(name[i]); }}
函数是想要输入十名同学的学号和姓名。
刚开始,我认为在gets函数前有加了一个getchar函数是多余的。于是我便删除了开头的那段代码,但是结果却无法运行。
总是在输完num[i]的数据后直接跳过了输入name[i]的过程。
百思不得其解的我只好去翻查资料。
最终我找到了问题的答案。
使用scanf函数,在输入完字符后,要按一下回车键。原本输入的字符都存储在缓存区中,在按下回车键后便被读取到变量中。但是在按下回车后多余了一个回车符,getchar()的作用就是把这个回车符读取掉,否则就被gets()函数读取,直接跳过了下一个变量的输入。(此处也可以使用gets())
那么问题就又出现了,为什么两个scanf函数就可以连续使用呢?
这就是gets函数和scanf函数的不同了:
scanf函数在输入整型数据时不能接受空格、制表符Tab、回车等;
这就是可以连续使用scanf函数的原因。
除此之外,两者还有不同点:
scanf函数如果输入了空格(空格键和tab键)会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。
在这里也存在一个问题,并不是在所有的scanf后面都要加上getchar()。因为我们产生的回车符为字符,所以只对使用scanf输入字符时有影响,也在输入字符前必须把回车符吸收掉。
最后再补充一下这三个函数各自的返回值:
1.scanf函数
scanf函数的返回值可以分成三种情况
1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b);
如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量);
如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。
2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。
3) EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。
2.gets函数
函数原型:char *gets(char *string)
格式:gets(字符数组或指针);
gets函数的返回值:
1.)正常读入(未遇到文件结尾)(注意,读入空串也是正常读入),则返回字符串,即返回字符串首地址,char*类型。
2.)遇到文件结尾,返回NULL。
3.getchar函数
它的返回值显而易见。
char a;
a=getchar();
就是我们从键盘输入的一个字符。
文章写到这里,我感觉我自己很有必要去看看C语言的各种标准头文件中是怎么定义这些函数的,对自己的帮助一定很大,要加紧开始了!
- C语言中getchar()、gets()和scanf()的特点以及scanf产生的多余回车符问题
- C语言中scanf、getchar、gets函数的比较
- C语言中gets(),scanf(),getchar()的区别
- C语言中getchar,gets,scanf的区别
- C语言中 scanf gets getchar 的区别
- C gets()、scanf和getchar()的区别
- C语言中scanf函数输入回车符的问题
- C语言中scanf函数输入回车符的问题
- C语言中scanf函数输入回车符的问题
- C语言中scanf函数输入回车符的问题
- C语言中scanf函数输入回车符的问题
- C语言中scanf函数输入回车符的问题
- scanf、getchar和gets的区别
- C语言scanf()和gets()的区别
- C语言输入中对scanf和gets的讨论
- C语言输入中对scanf和gets的讨论
- C语言中关于gets和scanf函数的理解
- C语言中scanf和gets的区别
- Android APP第一次使用引导界面的制作
- 用JAVA实现大文件上传及显示进度信息
- ListView下拉刷新
- 创建对于用户失败 在当前数据库存已存在
- iOS开发 学习计划图
- C语言中getchar()、gets()和scanf()的特点以及scanf产生的多余回车符问题
- 算法之美_源代码发布(3)
- 求字符串组合
- C语言字符的赋值与输出格式
- Java内存泄露
- Java集合部分
- Mac OSX中memcached安装测试
- 模式识别学习笔记(六)---Fisher判别
- 计算理论_可归约性