欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C学习笔记(7)--- typedef,输入输出

程序员文章站 2022-06-20 08:38:14
1.typedef: C 语言提供了 typedef 关键字,您可以使用它来为类型(type)取一个新的名字。 比如: typedef unsigned char BYTE; 然后你就可以把BYTE当成unsigned char 的缩写去使用: BYTE b1,b2; sub:按照惯例,定义时会大写 ......

1.typedef:

 

c 语言提供了 typedef 关键字,您可以使用它来为类型(type)取一个新的名字。

比如:

 

typedef unsigned char byte;

 

然后你就可以把byte当成unsigned char 的缩写去使用:

 

byte b1,b2;

 

sub:按照惯例,定义时会大写字母,以便提醒用户类型名称是一个象征性的缩写,但您也可以使用小写字母.

 

和#define的区别:

#define 是 c 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:

1.typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 one。

2.typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

3.#define可以使用其他类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做.

4.在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证.

 

2.输入输出(input and output):

 

熟悉任意一种编程语言的同学都大概知道怎么回事了,不过我们对于c的一些特性进行稍微深入的分析。

 

 

a.

c 语言中的 i/o (输入/输出) 通常使用 printf() 和 scanf() 两个函数。

 

scanf() 函数用于从标准输入(键盘)读取并格式化, printf() 函数发送格式化输出到标准输出(屏幕)。

 

sub:

int i;
char c;
scanf("%d%[^' '^'\n']", &i, &c);

如果遇到输入比较复杂的情况,尽量用正则表达式去解决。(因为输入流是有缓冲区的,我们输入的字符存储在那,然后再赋值给我们的变量。)

 

b.

stdio.h 是一个头文件 (标准输入输出头文件) and #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。

return 0; 来结束主函数(main function)

 

c.

和相对高级一点的语言相比,c的 printf() 函数的引号中使用 "%d" (整型) 来匹配整型变量 testinteger 并输出到屏幕。:

printf("number = %d", testinteger);   

当然,不同的类型有不同的标识;format 可以是一个简单的常量字符串,但是您可以分别指定 %s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。还有许多其他可用的格式选项,可以根据需要使用。

 

d. 

int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。

int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。

 

e.

char *gets(char *s) 函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 eof。

int puts(const char *s) 函数把字符串 s 和一个尾随的换行符写入到 stdout

 

sub:linux系统下需要这样编译:不支持 gets 与 puts, 需要用 fgets 和 fputs。需要注意的是,gets 和 puts都不安全,尽量都用fgets 和 fputs替代!

这是因为gets函数由于没有指定输入字符大小,所以会无限读取,一旦输入的字符大于数组长度,就会发生内存越界,从而造成程序崩溃或其他数据的错误。

 

 

 

 

 引用: