码迷,mamicode.com
首页 > 其他好文 > 详细

getchar(),scanf()等总结

时间:2015-03-29 12:10:25      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

 

 

getchar

、

getch

区别与用法

 

已有

 

 

getchar

, getch, 

区别

, 

用法

 

 

 

getchar()

和

getch()

的问题一直困扰着大家,关于他们的区别也是众说纷纭,

可没有一种说法是详细、

深入的,

今天我就在前人已有的成果上,

试着与大家继

续探讨下这个问题:

 

 

 

先看看规范点的说法:

 

 getchar

 

 This is a standard function that gets a character from the stdin.

 

 getch

 

 This 

is 

a 

nonstandard 

function 

that 

gets 

a 

character 

from 

keyboard, 

does 

not echo to screen.

 

 getche

 

 This 

is 

a 

nonstandard 

function 

that 

gets 

a 

character 

from 

the keyboard, 

echoes to screen.

 

 

Use getchar if you want it to work on all compilers. Use getch or getche 

on 

a 

system 

that 

supports 

it 

when 

you 

want 

keyboard 

input 

without 

pressing 

[Enter].And 

note 

that 

the 

return 

value 

of 

all 

three 

is 

int! 

You 

need 

this 

to properly check for EOF.

 

 

 

 

结合实际,谈谈具体的区别与用法:

 

getchar

()函数只有在满足输入次数要求的前提下,遇到回车时才结束输入,

之前所有的字符都会逐个显示在屏幕上,但是只有第一个字符返回一个

ASCII

码。

 

具体的过程就是

getchar()

被调用时,程序就等着用户按键,且将用户输入的字

符依次回显到屏幕,

用户必须摁完规定的次数

(循环语句)

(

即使是

 

回车也要摁)

,

所有的字符都会保留在键盘缓存区中(回车字符也放在缓存区中

)

,等待后续

getchar

调用读取。也就是说,后续的

getchar

调用不会

 

等待用户按键,而直

接读取缓冲区中的字符

,

直到读完规定的次数后

(并不是读完缓冲区的字符)

,

才

等待用户按键。

 

 

 getch

()函数任何时候遇到回车键都能结束,而且不会回显输入的字符,但是

每输入一个字符都会立即返回一个

ASCII

码。具体的过程就是,每摁一次键

 

就

调用一次

getch()

,直到遇回车结束。如果在规定次数前结束,系统论并没有存

入结束符,我们要手动地在他末尾添加一个‘

\

0’字符。这个也好理解,

 

其实

getchar()

就相当于是翻译型的,他连回车字符也给翻译了,然后一起存入;而

getch()

是解释型的,

每输入一条就翻译,

然后存入,

遇回车字

 

符时刚翻译完是

回车,所以他就得退出了。

 

getch

函数常用于程序调试中,

在调试时,

在关键位置显示有关的结果以待查看,

然后用

getch

函数暂停程序运行,当按任意键后程序继续运行。

 

 
我们看一个具体的例子:  Int I; 
char tmp[20]; 
for ( i=0  i<20; i++ ) { 
tmp[i] = getch()  //关键点1 // tmp[i]=getchar(); 
 
// putchar ( ‘*‘ )  
printf ( "%d=[%c]\n",i,tmp [i] )  if ( tmp[i] == ‘\r‘ ) { 
tmp [i] = ‘\0‘  //关键点2 break  }  } 
大家先分析下上面这段代码的功能吧,这是一个最多为20位的密码输入功能,既然是密码我们当然不希望他显示原字符,像linux用户验证那样什么也 不显示,但有的时候为了直观一点,我们可以加入putchar(‘*’)语句,就像QQ密码在你每输入一个字符时,他就回显一个“*”号。大家不防把上面 的代码敲一边,自己运行试试。 
 
接着上面的问题,为什么说读完规定的次数呢,实例中的for循环了20次,但我们在输入的时候可以输入30,50个字符,对系统来说反正是 放入缓冲区,放多少都是放,只不过在读取的时候只循环了20次,所以只能多20个字符,剩下的就被抛弃了。但是如果我们只想输入10个字符,那么你就得摁 剩下的10个回车键,因为getchar()输入的字符被存放在键盘缓冲区中.直到用户输入足够的次数(20次)按回车后才返回。因为在20次前,回车也 是当做一个普通字符存入缓存区的。 
也就是说,如果你的按键超过20次getch()自动结束,而getchar()没有任何提示,但在下次调用时只取前20个有效字符。如果你的按键不足20次,getch()遇到回车就退出,但是getchar()你必须按足20次后遇回车才结束, 
细心的朋友会发现,调用getchar()时真正输入的字符只有19个,因为系统默认把第一个字符设为‘\0’

NO.1

//**********

#include <stdio.h>
void main()
{
    int i;
    char  en;
    for (i=0;i<10;i++)
   {
      printf("Input:");
      en=getchar();
      switch(en)
     {
         case ‘a‘:
             printf("a\n");
             break;
         case ‘b‘:
             printf("b\n");
             break;
         default:
             printf("other!\n");
             break;
     }
  }
}

在这段代码中
不管是输入a,还是b
最后的输出总是(比如a)
Input:a
a
Input:other!

//******************

#include <stdio.h>
int main()
{
    int i;
    char  en;
    for (i=0;i<10;i++)
   {
      printf("Input:");
      en=getchar();
      getchar();
      switch(en)
     {
         case ‘a‘:
             printf("a\n");
             break;
         case ‘b‘:
             printf("b\n");
             break;
         default:
             printf("other!\n");
             break;
     }
  }
}

getchar是字符输入函数,假设我们同时输入aaa,它只会判断两个a,中间那个a就会被getchar吃了,switch()不会判断,所以建议用scanf("%c",&en);而scanf("%s",&en);字符串只会判断字符串的第一个字母!

//************************

#include <stdio.h>
void main()
{
    int i;
    char  en;
    for (i=0;i<10;i++)
   {
      printf("Input:"); scanf("%c",&en);/*此时为字符*/
    /*  en=getchar();此时为字符串
      getchar();  */
      switch(en)
     {
         case ‘a‘:
             printf("a\n");
             break;
         case ‘b‘:
             printf("b\n");
             break;
         default:
             printf("other!\n");
             break;
     }
  }
}

//******************

getchar(),scanf()等总结

标签:

原文地址:http://www.cnblogs.com/ganeveryday/p/4375465.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!