getchar(),scanf()等总结

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;
     }
  }
}

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

时间: 2024-10-04 22:33:18

getchar(),scanf()等总结的相关文章

关于cin,getchar(),scanf()的注意事项(转)

  问题描述一:(分析scanf()和getchar()读取字符) scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的.但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因.下面先看一个很简单的程序:程序1:    #include <stdio.h>    int main()    {char ch1, ch2;scanf("%c", &ch1); scanf("%c", &

C Language Study - gets , getchar &amp; scanf

慢慢的发现C语言功底是如此的薄弱,被这几个字符输入函数搞糊涂了又~~ 来,再来忧伤一次吧~ 那么,我们从scanf开始: 假如说你要将一串字符输入到一字符数组里,如以下程序, char a[2]; char b[3]; scanf("%s%s",a,b); printf("%s\n%s",a,b); scanf使用%s接收字符串,但是并不是每一个输入的字符都会被当做字符串处理,空格,tab,换行,都会被残忍的拒绝,因此输入一串"带有空格的字符串"

C语言编程之--scanf()函数与getchar()函数搭配来理解C程序的输入缓存(buffer)

博主最近在学习C语言编程,在书中的代码示例中出现了下面的代码段: #include<stdio.h> int main() { char a[5]; int i; printf("请依次输入值:\n"); for(i=0;i<5;i++) { scanf("%c",&a[i]); getchar(); //为什么要加一个getchar()? } printf("\n"); for(i=0;i<5;i++) { pr

scanf、gets、getchar

scanf: scanf("%c",..):可以读取空格.换行符.制表符等 scanf("%d",...):开始忽略空格.换行符.制表符,直到读取到一个字符 scanf("%s",...):开始读取时忽略空格.换行符.制表符,直到开始读取字符串,最后以空格.换行符.制表符结束,不丢弃任何字符 gets:直接读取字符串,最后以换行符结束,并且丢掉缓存中的换行符. getchar:读取一个字符. scanf("%d", &

输出与输出:putchar() getchar() printf() scanf() puts() gets() sscanf()

C语言中基本的输入输出函数有: putchar ():把变量中的一个字符常量输出到显示器屏幕上; getchar ();从键盘上输入一个字符常量,此常量就是该函数的值; printf ();把键盘中的各类数据,加以格式控制输出到显示器屏幕上; scanf ();从键盘上输入各类数据,并存放到程序变量中; puts ():把数组变量中的一个字符串常量输出到显示器屏幕上; gets ():从键盘上输入一个字符串常量并放到程序的数组中. sscanf(); 从一个字符串中提取各类数据.  putcha

C常见陷阱,scanf不执行,以及指针类型应用传递。

1.最近写了个结构体,一开始是这样的: typedef struct fsll { int  data_field; struct fsll *next; }FSLL; 很普通的一个链表结构体,工作需要数据域改成char类型. typedef struct fsll { char data_field; struct fsll *next; }FSLL; ... for(...) { printf("请输入数据域内容:") scanf("%c",&p->

[转]C语言 scanf() 输入字符屏蔽回车符的四种解决方法

使用'\n'屏蔽回车符号 scanf("%d\n",&n): scanf("%c",&c); 添加空格,屏蔽回车字符 scanf("%d",&n); scanf(" %c",&c); 使用getchar()来读取一次回车符号 scanf("%d",&n); getchar(); scanf("%c",&c); 使用fflush()清空输入流

C/C++ scanf和gets 区别

ref https://www.cnblogs.com/hlongch/p/5742477.html scanf和gets都能从输入流stdin读取字符串,那么它们有什么区别呢? scanf 留回车:开头忽略所有空格,以空格.制表符Tab(\r).换行符(\n)等结束,结尾自动加上'\0',并且这些字符会留在缓冲区中: gets 吃回车:开头接受任何字符,以换行符结束,并且会用'\0' 替换换行符作为字符串结尾. 相同点:字符串结尾自动加'\0' scanf和gets搭配混用时,需要注意是否接收

Huffman树与编码

带权路径最小的二叉树称为最优二叉树或Huffman(哈夫曼树). Huffman树的构造 将节点的权值存入数组中,由数组开始构造Huffman树.初始化指针数组,指针指向含有权值的孤立节点. b = malloc(n*sizeof(BTreeNode)); for (i = 0; i < n; i++) { b[i] = malloc(sizeof(BTreeNode)); b[i]->data = a[i]; b[i]->left = NULL; b[i]->right = NU