一、开发工具及环境
1.1 安装环境
mingw64
MinGW64功能介绍
1、用于生成Windows二进制文件的GNU工具的(编译器、链接器和档案管理器)
2、用于Windows平台安装和部署MinGW和MSYS的命令行安装器(mingw-get)
3、用于命令行安装器的GUI打包器(mingw-get-inst)
MinGW64软件特色
1、MinGW-w64 是开源软件,可以免费使用。
2、MinGW-w64 由一个活跃的开源社区在持续维护,因此不会过时。
3、MinGW-w64 支持最新的 C语言 标准。
4、MinGW-w64 使用 Windows 的C语言运行库,因此编译出的程序不需要第三方 DLL ,可以直接在 Windows 下运行。
5、那些著名的开源 IDE 实际只是将 MinGW-w64 封装了起来,使它拥有友好的图形化界面,简化了操作,但内部核心仍然是 MinGW-w64。
MinGW-w64 是稳定可靠的、持续更新的 C/C++ 编译器,使用它可以免去很多麻烦,不用担心跟不上时代,也不用担心编译器本身有bug,可以放心的去编写程序。
MinGW64安装方法
1、将MinGW64安装包下载下来并解压,将其拷贝到你要安装的目录。
2、环境变量
解压完毕之后需要配置环境变量
path下添加你的mingw64/bin,如:D:mingw64bin
在cmd窗口使用 gcc -v去查看下。
1.2 常用编译器
1.2.1 vscode
简介
VSCode 全称 Visual Studio Code,是微软出的一款轻量级代码编辑器,免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化。软件跨平台支持 Win、Mac 以及 Linux。
安装c环境
打开vscode,在输入框中输入c,之后点击c\c++,下载即可
同理,输入code runner,也下载这个插件
这就完成了c语言环境的配置,仅需这两个插件
1.2.2 visual studio
简介
Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。
安装
1. 官方下载地址
https://visualstudio.microsoft.com/zh-hans/vs/
2.选择c所需要的环境
配置安装位置即可
1.2.3 DEV c++
简介
Dev-C++(或者叫做 Dev-Cpp)是 Windows 环境下的一个轻量级 C/C++ 集成开发环境(IDE)。它是一款自由软件,遵守GPL许可协议分发源代码。它集合了功能强大的源码编辑器、MingW64/TDM-GCC 编译器、GDB 调试器和 AStyle 格式整理器等众多自由软件,适合于在教学中供 C/C++语言初学者使用,也适合于非商业级普通开发者使用。
安装
1.官网地址:https://sourceforge.net/projects/orwelldevcpp/
2.安装程序(都是选择下一步,建议更换安装地址)
二、程序员基本素养培训
2.1 命名习惯
(1)函数名用大写字母开头的单词来命名,例如:
void Initport(void);
void UpDisplay(void);
(2)变量用小写字母开头的单词来表示,例如
uchar openLight;
uchar closeLight;
(3)常量用全大写的字母,并用下划线分割单词,例如:
#define MAX_TIME 10
#define MIN_TIME 100
2.2 C 程序文件结构
c语言是一门结构化程序语言,由顺序结构、选择结构、循环结构组成,也可以把c语言看做是一门函数语言,它设计的程序功能看是由各个函数实现的,每个函数实现不同的功能。
3.2.1 C程序组成部分
main函数:每一个程序至少有一个主函数
文件头引用:头文件
变量定义部分:变量用于存储信息的名称
函数类型说明:
函数定义部分:用于完成特定的功能
注释语句:/* */ //
大括号:{ } 中的语句又称代码块
分好:; 用于表示每条语句的结束
三、C 语言语法
3.1 标识符和关键字
3.1.1 关键字
关键字是具有特定含义的、专门用来说明C语言的特定成分的一类单词。
C语言的关键字都是用小写字母书写的,不能用大写字母书写。关键字不能用于变量名或函数名等其它场合,否则会出现编译错误。
C语言定义了32个关键字。
C语言关键字列表
char |
double |
enum |
float |
int |
long |
short |
signed |
struct |
union |
unsigned |
void |
break |
case |
continue |
default |
do |
else |
for |
goto |
if |
return |
switch |
while |
auto |
extern |
register |
static |
const |
sizeof |
typedef |
volatile |
3.2.2 标识符
标识符是指用来表示变量名、符号常量名、函数名、数组名、类型名、文件名的字符序列。
(1)、C语言标识符的命名规则:
1、标识符只能由英文字母、数字和下划线3种字符组成。
2、第一个标识符必须是字母或下划线。
3、在标识符中,大小写是有区别的。如BOOK和book是两个不同的标识符。
(2) 、关于标识符的几点说明:
1、标识符不能与关键字重名。
2、标识符可以包含多个字符,但一般会有最大长度限制,与编译器有关,但一般情况下不会达到此限制。
3、定义标识符尽量做到见名知意。如sum表示求和。
正确标识符命名:smart _decision high3 Area
不正确标识符命名:5smart(以数字开头)
Bomb?(含有特殊字符?)
High.balance(把下划线“_”与“.”混淆)
float(不能用C语言中的关键字)
3.2 数据类型
3.2.1 基本数据类型
C语言基本数据类型有9种:整形int,长整形long,短整型short,字符型char,实型:单精型(float型)、双精度(double),void,有符号signed,无符号unsigned。
关键字 |
字节(字节) |
范围 |
格式化字符串 |
硬件层面的类型 |
备注 |
char |
1bytes |
通常为-128至127或0至255,与体系结构相关 |
%c |
字节(Byte) |
大多数情况下即signed char;在极少数1byte != 8bit或不使用ASCII字符集的机器类型上范围可能会更大或更小。其它类型同理。 |
unsigned char |
1bytes |
通常为0至255 |
%c、%hhu |
字节 |
|
signed char |
1bytes |
通常为-128至127 |
%c、%hhd、%hhi |
字节 |
|
int |
2bytes(16位系统) 或 4bytes |
-32768至32767或 -2147483648至2147483647 |
%i、%d |
字(Word)或双字(Double Word) |
即signed int |
unsigned int |
2bytes 或 4bytes |
0至65535 或 0至4294967295 |
%u |
字或双字 |
|
signed int |
2bytes 或 4bytes |
-32768至32767 或 -2147483648至2147483647 |
%i、%d |
字或双字 |
|
short int |
2bytes |
-32768至32767 |
%hi、%hd |
字 |
大多数情况下即signed short |
unsigned short |
2bytes |
0至65535 |
%hu |
字 |
|
signed short |
2bytes |
-32768至32767 |
%hi、%hd |
字 |
|
long int |
4bytes 或 8bytes |
-2147483648至2147483647 或 -9223372036854775808至9223372036854775807 |
%li、%ld |
长整数(Long Integer) |
即signed long |
unsigned long |
4bytes 或 8bytes |
0至4294967295 或 0至18446744073709551615 |
%lu |
整数(Unsigned Integer)或 长整数(Unsigned Long Integer) |
依赖于实现 |
signed long |
4bytes或 8bytes |
-2147483648至2147483647 或 -9223372036854775808至9223372036854775807 |
%li、%ld |
整数(Signed Integer)或 长整数(Signed Long Integer) |
依赖于实现 |
long long |
8bytes |
-9223372036854775808至9223372036854775807 |
%lli、%lld |
长整数(Long Integer) |
|
unsigned long long |
8bytes |
0至18446744073709551615 |
%llu |
长整数(Unsigned Long Integer) |
|
float |
4bytes |
2.939x10−38至3.403x10+38 (7 sf) |
%f、%e、%g |
浮点数(Float) |
|
double |
8bytes |
5.563x10−309至1.798x10+308 (15 sf) |
%lf、%e、%g |
双精度浮点型(Double Float) |
|
long double |
10bytes或 16bytes |
7.065x10-9865至1.415x109864 (18 sf或33 sf) |
%lf、%le、%lg |
双精度浮点型(Double Float) |
在大多数平台上的实现与double相同,实现由编译器定义。 |
_Bool |
1byte |
0或1 |
%i、%d |
布尔型(Boolean) |
|
3.2.2. 复合数据类型
在C语言中,复合数据类型可分为三类:结构、联合和枚举。在现代C语言中,联合和枚举的使用频率已逐渐减少。
(1) 结构
主条目:结构体 (C语言)
结构(structure variable)允许构造由多个基础数据类型组合而成的复杂结构。结构为面向对象编
typedef struct Bintree { int data; struct bintree lchild; // left child of the node struct bintree rchild; // right child of the node } bintree; // 自定义 bintree 类型
为结构定义变量时通常会用到动态内存分配:
#define mktree() (bintree *)malloc(sizeof(bintree)) // 分配该结构所需的内存单元数量 bintree *tree; tree = mktree(); // 分配到 tree 指针 tree->data = 1; tree->lchild = mktree(); ...
由于C语言不具备自动垃圾收集(Garbage Collection)功能,使用完毕后调用free(treePtr)来释放之前通过malloc(size)分配的内存。详见指针。在C99标准中,还添加了名为伸缩型数组成员的特性,关于此特性的内容超出了该条目的介绍范围,若需了解更多信息可参见文档或其它材料。
(2)联合
主条目:联合体
**联合(union)**与结构相类似,但不同的是,联合在某一特定时刻只有最后被使用的成员的值是确定的,因此一个联合只使用所有成员中所占空间最大的成员所使用的内存。然而,一些编译器可以通过编译参数或#pragma的方式强制联合使用与所有成员所占储存空间的和相等的储存空间,在这种情况下,除最后被使用的成员外,其余成员的值是未定义的。以下给出了联合的一个声明:
union foo{ int bar; double foobar; }; foo.bar = 8; foo.foobar = 3.14;
在这个例子中,假设使用32位平台编译,一个double变量占8字节,一个int变量占2字节(由上表得),则该联合所占大小即为double类型的大小——8字节。在这段程序执行完毕后,foo.bar的值是未定义的,而foo.foobar的值为3.14。
(3)枚举
**枚举(enumerated type)**用来声明一组整数常量。默认情况下,枚举声明格式为enum type{value1,value2,…,valuen};此时value1,value2分别为0,1,直到n-1。事实上,枚举类型在C语言实现中是以int类型储存的。以下是枚举的一个声明:
enum a { b , c , d };
在此之后,便可以以如下方式使用:
enum a foo; foo = b; if(foo != c) //等同于if(foo != 1) { do_something(); }
而此时的b,c,d分别为0,1,2。另外,也可以手动为枚举列表中的常量赋值。下面是一个例子:
enum colour {red = 100,blue = 700,yellow = 200};
则此时red,blue,yellow的值分别为100,700,200.
需要注意的是,枚举在C和C++中所表现的行为有一些细微的差异。参见C与C++的兼容性。
四、运算符和表达式
4.1 算术运算符
(1). +加法运算或正值运算符
4+4、+5、
(2)…- 减法运算或负值运算符
6-4、-10、-29
(3). 乘法运算
注意符号,不是x,而是
(4). /除法运算
注意符号,不是÷,也不是\,而是/
整数除于整数,还是整数。1/2的值是0,这个并不是二分之一, 不会四舍五入,直接截断取值。
(5)%取余运算
取余:即两个整数相除之后的余数
注意:%两侧只能是整数,正负性取决于%左侧的数值 2.注意:
(1).当运算对象是负数时,不同机器的运算结果也可能是不同的。
(2).双目运算符两边的数值类型必须一致才能进行运算,所得结果也是相同类型的数值。
(3).双目运算符两边的数值类型如果不一致,必须由系统先进行一致性转换。转换规则:char->short->int->unsigned->long->double->float
(4).C语言规定,所有实数的运算都是以双精度方式进行的,若是单精度数值,则需要在尾数后面补零,转换长双精度数才能进行运算。
4.2 算术运算符的目数
7个运算符中,+(正号),-(负号)都是单目运算符,剩下的5个都是双目运算符,单目运算符是指它只需要一个运算量(即操作数)
比如-5,只需要在负号后写一个数,前边不需要,故是单目运算符。而双目运算符则需要两个运算符。例如a+b。加号前各需要一个运算量。
4.3 算数表达式
(1).算术表达式是用算术运算符和括号将运算量(也称操作数)连接起来的、符合C语言语法规则的表达式。其中运算对象包括函数、常量、变量。
(2).算术表达式的运算规则:
A.在算术表达式中,可以使用多层圆括号,但括号必须配对。运算时从内层括号开始,由内向外依次计算各表达式的值。
B.在算术表达式中,对于不同优先级的运算符,可按运算符的优先级由高到低进行运算,若表达式中运算符的优先级相同,则按运算符的结合方向(算术运算符的结合方向是从左到右)进行运算。
C.如果一个运算符两侧的操作数类型不同,则先利用自动转换或强制转换,使两者具有相同数据类型,然后再进行运算。
4.4 算数运算符的优先级
4.5 赋值运算符和赋值表达式
赋值运算符就是=,表示“存储”,即把赋值号右边表达式的值存给右边的变量
1.左值的概念
可以出现在赋值号左边的式子,称为左值(left value)。左值必须有内存空间且允许赋值。常用的左值是变量,但常变量不是左值。
const int b=2; a=2; //变量作为左值,正确 b=20; //语法错误;常变量不是左值
2.赋值运算符的结合性
从右至左。若有两个赋值号,要先执行右边的。
例如:a=b=2相当于是a=(b=2).
3.复合赋值
(1)在赋值运算符之前加上其他运算符可以构成复合赋值运算符。其中与算术运算有关的复合运算符有+=、-=、=、/=、和%=等。
(2)注意:
1.两个符号之间不可以有空格
2.复合赋值运算符的优先级与赋值运算符的相同。表达式n+=1等价于n=n+1,作用是去变量n中的值增1再赋值给变量n,其他复合赋值运算符的运算规则以此类推。例:求表达式a+=a-=aa的值
解:先进行“a-=aa”运算,相当于a=a-aa=12-144=-132
再进行“a+=-132”运算,相当于a=a+(-132)=-132-132=-264
3.如果赋值运算符两侧的类型不一致,在赋值前系统将自动先把右侧的值或通过表达式求得的数值按赋值号左边变量的类型进行转换。
https://blog.csdn.net/qq_42748213/article/details/116407498
4.6 自增自减运算符
自增运算符++,自减运算符--。两个运算符都是单目运算符,都是右结合性,运算优先级与正负号相同。
1.自增运算符
自增运算符++分为前++和后++,写在变量前面的是前++,写在变量后面的后++。但是运行结果相同。
对于i++来说,因为i写在前面,++写在后面,所以先取i的值(即1)作为表达式(i++)的值,然后再给i加1,使i变成2.
所以左侧的“m=++i”就相当于
i=i+1 //先给i加1
m=i; //表达式(++i)的值赋给m
而右侧的“m=i++”;则相当于
m=i; //表达式(i++)的值赋给m;
i=i+1; //给i加1
4.7 逗号运算符和逗号表达式
逗号“,”就是逗号运算符,而用逗号运算符将几个表达式连接起来,如:a=b+c,b=a*a,c=a+b,称为逗号表达式
1. 一般形式:
表达式1,表达式2,表达式3,„表达式n
2.结合方向:
从左到右 例:3,5->5
例:c=a+b,a=2,b=3->c的值不准确,是一个随机值,因为逗号表达式是从左向右结合的
3.逗号表达式的求解过程是
先求表达式1,然后依次求解表达式2,直到表达式n的值。整个逗号表达式的值就是表达式n的值。
4.注意:
逗号运算符是所有运算符中级别最低的。
4.8 求字节运算符(sizeof)
1.sizeof()的作用
用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。
2.基本形式:
(1).sizeof( 变量\常量 );
(2).sizeof 变量\常量;
(3).sizeof( 数据类型 )
(4) 注意其形式没有sizeof 数据类型
五、输入和输出
分类
输入方法有(按照顺序):scanf、getchar、gets、getc、fgetc、fgets、ungetc、getche、getch 不包含(fread、fscanf)
输出方法有(按照顺序):print、putchar、puts、putc、fputs、fputc 不包含(fwrite、fprintf)
常用输出格式:
格式字符d 以十进制形式输出带符号整数(正数不输出符号)o 以八进制形式输出无符号整数(不输出前缀O)x 以十六进制形式输出无符号整数(不输出前缀OX)u 以十进制形式输出无符号整数f 以小数形式输出单精度实数lf以小数形式输出双精度实数e 以指数形式输出单、双精度实数g 以%f%e中较短的输出宽度输出单、双精度实数c 输出单个字符s 输出字符串
输入方法:
scanf()
#include int main() { char ch1, ch2; scanf("%c", &ch1); scanf("%c", &ch2); printf("%d %d\n", ch1, ch2); return 0; }
运行结果如下:
原因如下:scanf从输入流缓冲区中提取数据,并非在键盘缓冲区里面提取数据。1.当我们用键盘输入一个a的时候,然后会按enter,在按enter之前,a在键盘缓冲区,而输入流缓冲区里面并没有东西,scanf处于等待状态。2.当我按下enter之后,字符a和enter都进入输入流缓冲区,scanf开始读取一个字符a,然后再读取一个enter,输入流缓冲区已经没有东西了。此时我们也输出了。
对于输入两个字符:
#include int main(){ char ch1,ch2; //注意第一个scanf里面的空格 scanf("%c %c",&ch1,&ch2); printf("%d %d\n",ch1,ch2); scanf("%c%c",&ch1,&ch2); printf("%d %d\n",ch1,ch2); return 0; }
第一个scanf和第二个scanf,都输入a b,会出现什么不同的结果?
这是为什么呢?过程是这样的:第一个scanf里面%c %c之间有一个空格,所以在输入字符a之后,我们可以输入空格,enter,或者任何一个字符,scanf都会自动忽略它,从而当我们输入字符b 的时候scanf准确无误的读入。因此printf得到的就是a和b对应的ASCII码97和98。此时输入流缓冲区里面仍然有一个enter(键入b之后按下的enter),所以第二次输入a和b,其实只读取了一个enter和a,于是得到的就是10和97。
对于字符串:
char str[20]; scanf("%s",str); 使用scanf()把一串字符串读进一个字符数组时,不使用& #include int main() { char str1[20], str2[20]; scanf("%s",str1); printf("%s\n",str1); scanf("%s",str2); printf("%s",str2); return 0; }
运行结果如下:
分析如下:其实这里的原因和字符读入是一样的。hello world!在按下enter以后,包括enter都进入到输入流缓冲区,而scanf遇到 回车(enter),空格,TAB 就会停止,所以当第一个scanf遇到了hello以后的第一个空格时,就停止读取数据了.因此str1就是hello (包括空格),而 C!还在缓冲区中,所以第2个scanf会直接从输入流缓冲区中读取 C!
补充_1:scanf()函数调用成功,则返回成功读入的数据项数,否则,读入数据时遇到了"文件结束",则返回EOF(可以当作 - 1)
如:scanf("%d %d",&a,&b);
函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
补充_2:什么是非法数据 ? 如:对于%d来说,除了 int 型都是非法数据
getchar()
#include int main(){ char ch1,ch2; ch1=getchar(); ch2=getchar(); printf("%d %d\n",ch1,ch2); return 0; }
运行结果:
原因如下:
getchar从输入流缓冲区中提取数据,并非在键盘缓冲区里面提取数据。1.当我们用键盘输入一个a的时候,然后会按enter,在按enter之前,a在键盘缓冲区,而输入流缓冲区里面并没有东西,getchar处于等待状态。2.当我按下enter之后,字符a和enter都进入输入流缓冲区,getchar开始读取一个字符a,然后再读取一个enter,输入流缓冲区已经没有东西了。此时我们也输出了。
可以利用循环将字符依次读入到字符串数组,getchar()可以接收换行符,因此需要在循环读入的过程中消除换行字符。
char s[20]; int n=0; while(1) { s[n]=getchar(); // 读入1个字符 if (s[n]=='\n') { break; // 如果是换行符,则结束循环;相当于清除缓存中输入确定的换行符 } n++; } int getchar(void);
注意getchar()返回的是int型。
gets()
#include int main() { char str1[20], str2[20]; gets(str1); printf("%s\n",str1); gets(str2); printf("%s\n",str2); return 0; }
运行结果如下:
这是因为:gets可以接受空格而且gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回。gets()函数并不读取换行符’\n’,它会把换行符替换成空字符’\0’,作为C语言字符串结束的标志
而且gets()读取字符是没有上限的
char* gets(char *s);
注意gets()返回的是char型指针哦~所以还可以这么用:
char str[20]; char *ptr; ptr = gets(str);
关于 scanf、getchar、gets 总结如下:
1.scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中)。
2.getchar()以Enter结束输入,也不会舍弃最后的回车符。
3.gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
getc()
函数原型:
int getc(FILE *stream)//表示从文件读取字符
注意getc()返回的是int型哦~
从键盘输入一个字符
a = getc(stdin)//从输入缓冲区读取字符
如果读取失败或者到了文件结束标志返回EOF(-1)
fgetc()
在C语言中fgetc()和getc()的用法是一样的,但是最大的区别在于:fgetc()是函数,getc()是宏(其中fget前面的字母f即为function函数的意思)使用这两个函数时,需要注意如下几点:
1、 getc的参数不应当是具有副作用的表达式。有副作用的表达式,指的是表达式执行后,会改变表达式中某些变量的值。比如++i * ++i2、 因为fgetc一定是一个函数,所以可以得到其地址。这就允许将fgetc的地址作为一个参数传送给另一个函数3、 调用fgetc所需时间很可能长于调用getc,因为调用函数通常所需的时间长于调用宏
所以一般情况下用getc()就好了
fgets()
gets()和fgets()的相同点:
1.fgets的参数stream指定为stdin时,两者都能从标准输入中读取字符串。
2.读取成功都返回地址,失败都返回NULL
gets()和fgets()的不相同点:
1.用法不同,fgets()可以设置接收字符个数
2.fgets()会多吃一个回车符号’\n’(即fgets()函数会读取换行符)
举例
#include #include int main() { char buf[1024] = {0}; gets(buf); int len = strlen(buf); printf("len = %d\n", len); char buf2[1024] = {0}; fgets(buf2, sizeof(buf2), stdin); len = strlen(buf2); printf("len = %d\n", len); return 0; }
结果如下:
说明虽然fgets()设置读取3个字符,但实际最后吃掉了换行符(即把’\n’作为最后一个字符)
因为gets()没有接收上限,且gets()不会检查数组是否能够装的下输入行,所以总的来说,fgets()比gets()安全
ungetc
原型
int ungetc(int c, FILE *stream);//一般写stdin
作用:能向流stream中放回一个字符(除了EOF字符)尽管ISO C支持放回任何个的字符,但是实现中我们不应该放回超过一个字符
不能使用ungetc()将字符放回文件或者设备,因为它们保存在标准IO库的缓冲区中
举例
#include int main() { int i,sum = 0; char ch; while(scanf("%d",&i) == 1) //一直输入一直循环 { sum+=i; while((ch = getchar()) == ' ') //屏蔽空格 ; if(ch == '\n') break; ungetc(ch,stdin); } printf("%d",sum); return 0; }
效果:
input: 22 33 33 44 output: 132
ungetc()在此的作用是返回getchar()多接收的一个字符(非空格字符)给 标准输入流(stdin)
getche()
在头文件< conio.h>中
#include #include int main() { char ch; for(int i=0;i<5;i++) { ch=getche(); printf("%c",ch); } return 0; }
结果如下:
getche()是用于获取单个字符的,与getchar()的区别就是:getche()实际是一个输入命令,作用是从键盘接收一个字符,而且并把这个字符显示出来,就是说,你按了一个键后它在屏幕上显示,并继续运行后面的代码
getch()
在头文件中
#include #include int main() { char ch; for(int i=0;i<5;i++) { ch=getch(); printf("%c",ch); } return 0; }
结果如下:
getch()也是用于获取单个字符的,作用与getche()类似,唯一的区别就是:getch()从键盘接收一个字符,却不把这个字符显示出来,就是说,你按了一个键后它在屏幕上不显示,但是继续运行后面的代码
缓冲区刷新
缓冲区刷新是非常重要的,不然容易导致数据混乱,对我们的程序造成很大的影响。这里只简述 C 里面最常用的刷新方式:
int fflush(FILE *stream);//里面写 stdin,即标准输入流
//成功返回0
输出方法:
print()
printf()函数的输出格式很多,可以根据不同格式加转义字符,达到格式化输出(因为经常用,所以我就不讲了)
putchar()
作用是输出一个字符
#include int main() { char ch = 's'; putchar(ch);//打印字符 s return 0; }
注意:putchar()和getchar()都是把字符当做int类型而不是char类型来使用的