码迷,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 

nonstandard 

function 

that 

gets 

character 

from 

keyboard, 

does 

not echo to screen.

 

 getche

 

 This 

is 

nonstandard 

function 

that 

gets 

character 

from 

the keyboard, 

echoes to screen.

 

 

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

on 

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
迷上了代码!