`

C语言字符的输入输出原理

 
阅读更多

 

 

例:

 

#include<stdio.h>
int main(void)
{
   char ch; 
   while((ch = getchar()) != '#')
        putchar();
   return 0;
}

 

 在这个程序中,运行情况如下:

   hello,world [Enter]     -->输入"hello,world"后输入Enter键

   hello,world                -->自动打印

   this is a test![Enter]   -->输入"this is a test!"后输入Enter键

   this is a test!             -->自动打印

为什么会是在输入Enter键之后才执行putchar()打印,而不是输入一个字符就打印一个字符(类似与hheelloo,,wwoorrlldd形式)的呢?

 

这是因为在大多数操作系统上是延迟回显,在这种情况下您所键入的字符被收集并存储在一个缓冲区中,按下回车键后会把缓冲区中所有的

字符一起输出(并把缓冲区清空)。(有的操作系统是立即回显,即没有缓冲区,输入一个字符,显示一个字符)

 

注意:

 许多程序使用getchar()来逐个字符的读取输入。通常,系统使用行缓冲 输入(line-buffered input),这意味着输入的内容在您按下回车

键时被传输给程序。按下回车键的同时还将传输一个编程时需要注意的换行字符。ANSI C把缓冲输入作为标准。

 

在使用scanf()函数进行输入时:

           1. 对于scanf("%d",&input)形式,scanf()函数处理的方式是这样的:

例:假如输入的数据是如下形式:  12c[Enter]       //[Enter是回车键]

         输入缓冲区中的所有字符在缓冲区的排列如下:

 

     ' '      ' '         1           2      c            \n    

 按下回车键后,scanf()函数开始每次读取一个输入字符,它跳过空白字符(空格,制表符和换行符)直到遇到一个非空白字符。因为他试图读取一个整数,所以scanf()期望发现一个数字                         字符或者一个符号(+或者-).

如果遇到了一个非数字的字符,他就得出结论:已读到了整数的尾部。scanf()把这个非数字字符放回输入缓冲区。这就意味着当程序下一次开始读取输入时,它将从前面被放弃的那个非                           数字字符开始。最后,scanf()计算读取到的数字的相应数值,并将该值放到指定的变量中。

如果第一个非空白字符不是数字,将会发生什么呢?比如说,是A而非一个数字?这时scanf()会停在那里,并把A(或者不管什么)放回输入。没有把任何值赋给指定的变量,程序下一次                           读取输入时,它就在A处重新开始。如果程序中只有%d这个说明符,scanf()永远也不会越过那个A去读下一个。而且,如果您使用带有多个说明符的scanf()语句,ANSI C 要求函数在第一                          个出错的地方停止读入输入。

           2.对于scanf("%s",&input)形式,scanf()函数处理的方式是这样的: 

                    如果使用%s说明符,那么空白字符(空格,回车,制表符)以外的所有字符都是可接受的,所以scanf()跳过空白字符直到遇到第一个非空白字符,然后保存再次遇到空白字符之前的所有非空白字符.这就 意味着%s 是scanf()读取一个单词,也就是说,一个不包含空白字符的字符串。如果使用字段宽度,scanf()在字段的结尾或者第一个空白字符处停止。不能通过字段宽度使得scanf()用一个%s说明符读取 多于一个字的输入。最后一点:当scanf()把字符串放在一个指定的数值中,他添加终止的'\0'使得数组内容成为一个C字符串。 

           3.对于scanf("%c",&input)形式,scanf()函数处理的方式是这样的:   

   如果使用%c说明符,那么所有的输入字符都是平等的。如果下一个输入字符是一个空格或者换行符,将会把这个空格或者换行符赋给指定的变量;不会跳过空白字符。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    C语言基础之转义字符:从原理到应用的字符编码教程 .txt

    提供了多种字符编码和转换的功能,如输入和输出字符的实体、ASCII码、八进制转义字符、十六进制转义字符等,以及支持多个字符的批量转换和显示。本资源适合C语言编码和转换的学习者和工程师使用,帮助他们通过Web...

    输入输出:我对C语言中输入输出理论的理解

    输入输出我对C语言中输入输出理论的理解第一次提交:出于各种原因,我于2020年开始学习C.现在,我将证明我对学习计算机科学的深奥原理感兴趣。 经过进一步的调查,我得出结论,从60年代末开始,最初的Unix家族的语言...

    C语言中输入输出流与缓冲区的深入讲解

    缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。 原理介绍: 当调用输入函数scanf()时,输入函数会将我们输入的数字输入到输入缓冲区, 而当我们的输入缓冲区有内容时,再次输入将不会被...

    上海电机学院C语言实训答案

    (5)编写一个程序实现如下功能:从键盘输入字符(最多为80个),遇到回车键输入结束,将输入的字符串按奇偶位置拆分,奇数位上的字符在前,偶数位上的字符在后,重新组成新的字符串输出,例如输入: ab12cd3456fg,...

    深度剖析C语言知识体系 原理+实践,一课带你吃透C语言

    第11章 文件的输入输出 第12章 线程与并发 第13章 编译、链接和库 第14章 GUI 编程实践 第15章 综合案例:桌面跨平台高仿Mac版计算器 第16章 综合案例:桌面跨平台的下载工具 第17章 课程总结

    编译原理C语言预测分析程序

    用C语言实现了一个简单的预测分析程序。将预测分析表中的推导过程用二维函数指针的形式存储,对于给定的文法能正确推导并给出过程.若不能推导出来,程序会运行错误(暂未做处理)

    华中科技大学复试字母转换C语言上机

    内容概要:通过手写简化版字母转换源...③C语言的基本语法,如输入输出,函数,变量等。 阅读建议:本资源旨在帮助考生理解字符处理的基本原理和方法,在学习的过程中要注重理解代码逻辑,并通过实践调试来加深理解。

    编译原理课程设计 词法分析 C语言/c++版

    编译原理课程设计之一用编程语言实现词法分析,用C++实现 注释清楚详细,程序风格良好 /*目前实现的功能有: */ /* 0.课程要求的词法分析基本功能 */ /* 1.识别用户定义的初次定义的变量还是已经定义的变量还是错误...

    编译原理 C语言实现词法分析

    词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是按类来安排种别码的方式。 2、部分单词的BNF表示(可参考教材43页的...

    编译原理,词法分析代码实现,C语言程序,保证能运行

    课程:编译原理 实现:编译过程第一步“词法分析代码实现“” 语言:C语言程序 保证能运行 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 各种单词符号对应的种别码:(1)关键字 (2)运算符和界...

    编译原理C语言生成LR1分析表.rar

    将文法拓广为G[M] 计算每个字符的FIRST集合 计算每个闭包的项目集以及GO函数 计算分析表的动作函数ACTION和状态转换函数GOTO 输入需分析的语句,根据已知的分析表,对该语句进行语法分析,并输出该分析过程

    词法分析器C语言编写(附实验报告)

    通过C语言编写一个词法分析器完成输入是字符串(或源程序文本文件),输出是源程序中各单词的字符串、起止位置、词的类别。附带实验报告。

    C语言的词法分析器(编译原理)

    将输入输出的结果以文件的形式保存,并用数据测试结果的正确性。 编译程序完成词法分析功能,扫描输入字符流,产生用于语法分析的词法记号序列。下述文法描述了该词法分析程序: &lt;标识符&gt;--&gt;&lt;字母&gt;|&lt;标识符&gt;&lt;字母&gt;|...

    编译原理 C语言词法分析器(JAVA写的)

    输入一个文本文件的C语源代码可以识别并输出至一个文本文件中,如下: # 5:界符 include 2:保留字 运算符 stdio.h 1:头文件 &gt; 4:运算符 main 2:保留字 ( 5:界符 ) 5:界符 { 5:界符 char 2:保留字 8888c 0:错误单词 ;...

    编译原理 - LR(1)分析法:C/C++实现

    LR(1)(Left-to-Right, Rightmost ...在每一步中,根据输入字符和当前状态,在ACTION表中查找相应的操作。如果是移进操作,将状态和输入字符压入栈中,并打印当前步骤的状态。如果是归约操作,根据产生式进行出栈操作,

    C语言参数个数可变函数详解

    *printf()/*scanf()系列函数,用于输入输出时格式化字符串;exec*()系列函数,用于在程序中执行外部文件(main(int argc,char*argv[])算不算呢,与其说main()也是一个可变参数函数,倒不如说它是exec*()经过封装后的...

    c语言词法分析

    编译原理作业。 实验:词法分析 一、实验目的:编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号...

    词法分析(c语言实现)程序代码+报告

    一、 实验目的 调试并完成一个词法分析程序,加深对词法分析...输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。

    编译原理词法分析程序设计与开发:对输入的字符串形式的源程序按顺序进行扫描,根据源程序的词法规则识别具有独立意义的单词(符号),并输出与其等价的Token序列

    编译原理词法分析程序设计与开发:对输入的字符串形式的源程序按顺序进行扫描,根据源程序的词法规则识别具有独立意义的单词(符号),并输出与其等价的Token序列

    51单片机基础应用设计C语言实例(400例)合集.zip

    51单片机基础应用设计C语言实例(400例)合集: 10-LED循环左移 100-24c02记忆开机次数 101-24c02存储上次使用中状态 102-DS1302 时钟原理 103-DS1302可调时钟 104-DS1302时钟串口自动更新时间 105-1602液晶显示DS...

Global site tag (gtag.js) - Google Analytics