A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 huangqiwa 于 2014-6-23 22:38 编辑

前言:
         在做黑马程序员基础测试题的时候,由于测试题有涉及到一些字符串的输入,而且需要涉及到包含空格的字符串,所以在做完这些测试题的时候,也对一些基本的输入函数有一些了解,现在做一个总结。

scanf

scanf函数,默认情况下是遇到空格或者回车后结束本次输入,等待下一次输入。

按照这种逻辑,那么我做一个while循环,用scanf循环输入,然后当需要结束while循环的时候,直接输入空格或者回车,用if(scanf("%d",&n)==1)来判断scanf是否成功接受输入,从而结束循环。理论上是可行的,但是当我实现的时候才发现,如果scanf发现你没有输入任何字符,直接输入的空格或者回车符,scanf回自动过滤掉空格或者回车符,直到你输入了字符!所以,想直接用空格和回车符直接结束scanf的输入是不行的!下面做一个简单的测试,下面代码运行后,直接输入空格或者回车符,scanf并没有结束!
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int n;
  5.         scanf("%d",&n);
  6.         return 0;
  7. }
复制代码

如图(附件图片),我的输入了若干空格和回车后,光标已经移动到了后面,scanf函数并没有结束输入,而是等待用户的输入,直到输入了字符后,再次遇到空格或者回车结束!

另外,scanf默认情况下也是不能接受包含空格的字符串的,因为遇到了空格就结束!
下面这种方法可以使scanf接受空格的输入:
  1. #include <stdio.h>
  2. void main()
  3. {
  4. char a[100];
  5. scanf("%[^\n]",a);//直到输入回车键,读取才结束
  6. printf("%s",a);
  7. }
复制代码

[^\n]的意思就是使scanf遇到回车符后才结束,那么遇到空格并不结束输入!

如果在没有明显结束标识的情况下需要判断循环的结束,可以利用scanf的返回值来判断

scanf的返回值是成功接收参数的个数
scanf("%d%d",&a,&b);
如果a,b都被成功读入,那么scanf的返回值为2
如果只有a被成功读入,那么scanf的返回值为1
如果a跟b都没有成功读入那么scanf的返回值为0

因此if(scanf("%d",&n)==1)可以用来判断是否成功输入,并且结束循环

gets

gets函数比较好用,可以接受包含空格的字符串,直到遇到回车才结束输入,使用方法如下:
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         char c[100];
  5.         gets(c);
  6.         return 0;
  7. }
复制代码

这里需要注意的就是,gets函数没有让用户指定输入字符的大小,没有限制输入缓冲区的大小,那么如果你输入的字符串超过了100个字符,将会发生内存越界,发生不可预料的后果。可以使用fgets代替gets

getchar

getchar 顾名思义,每次获取一个字符,也包括空格字符,遇到回车结束!

当我在做题的时候发现,有时候使用了scanf后,后面的代码判断会出问题,后来经过查询才知道,scanf输入后会在输入缓冲区中留下一个回车符,那么如果后面的代码接着有一个getchar()的话,因为getchar()也是从输入缓冲区中取一个字符,那么getchar()就会将上次scanf遗留的回车符获取到,因此影响代码原本的用意;因此我们需要使用了scanf后清除遗留在缓冲区中的回车符

所以通常使用了scanf后可以跟一个getchar来将scanf遗留的回车符吸取掉
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         char c[100];
  5.         scanf("%s",&c);
  6.         getchar();
  7.         return 0;
  8. }
复制代码

或者使用fflush(stdin);也可以清除输入缓冲区!

另外,如果你是在windows平台下,我们做练习的时候,可以在代码最后,return之间加上一个getchar();来达到使程序停留在屏幕上的目的。

getch

getch跟getchar一样,都是获取一个字符,他们的区别就在于,getch没有回显,就是你按下了键盘上的字符后,不会显示在控制台中,而getchar按下了键盘后,在控制台中是可以看到你刚才输入的字符

getch在conio.h这个头文件中
使用方法如下:
  1. #include<stdio.h>
  2. #include<conio.h>
  3. int main()
  4. {
  5.         char ch;
  6.         ch=getch();
  7.         printf("%c",ch);
  8.         return 0;
  9. }
复制代码

我个人使用getch通常是在有菜单的情况下,需要用户选择进入哪个菜单的时候,我会使用getch让用户直接按下编号后直接进入,而不需要用户输入1后按一下回车,或者屏幕上还有回显!
例如:
****************************
1.计算加法
2.计算减法
3.计算乘法
4.计算除法
****************************
请选择:
那么这个时候,用户输入了就直接进入,不需要按下回车或者回显!

目前就想到这么多,希望大家多多补充,多多交流!

scanf.jpg (27.89 KB, 下载次数: 4)

scanf.jpg

2 个回复

倒序浏览
先顶后看。
回复 使用道具 举报

感谢支持 !多多交流 !
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马