字符串的输入输出
puts函数只需要给出字符串参数的地址
/**put_out.c---使用puts()*/
#include<stdio.h>
#define DEF "i am a #define string"
int main(void)
{
char str1[80]="An array was initialized to me.";
const char *str2="A pointer was initialized to me.";
puts("I'm an argument to puts().");
puts(DEF);
puts(str1);
puts(str2);
puts(&str1[5]);//从数组下标第五个开始输出
puts(str2+4);
return 0;
}
puts()显示字符串时自动在其后添加一个换行符
printf() 使用修饰符和标志示例
/*width.c--字段宽度*/
#include<stdio.h>
#define PAGES 931
int main(void)
{
printf("*%d*\n", PAGES);
printf("*%2d*\n", PAGES);
printf("*%10d*\n", PAGES);
printf("*%-10d*\n", PAGES);
return 0;
}
第一个转换说明是不带任何修饰符的%d。他生成了一个与要打印的整数相同的字段。这是默认选项也就是说在没有进一步的指令下,这就是打印出的结果
第二个转换说明是%2d。他指示应该产生宽度为2的字段,但是由于该整数有3位数字,所以字段自动扩展以适应数字的长度。
第三个转换说明是%10d 这将产生一个长度为10个空格那么宽的字段,于是在星号之间有7个空白和三个数字,并且数字位于10个字段的,在星号之间有7个空白3个数字,并且数字位位于最右端。
最后一个是说说明%-10d,它产生10个空格宽的字段,标志‘-’ 把数字放到最左端
翻译程序的第一步首先把源代码中出现的字符映射到源字符集
明显常量#define 的用符号#开头,ANSI标准允许#前有空格或制表符,而且该标准还允许在#和指令的其余部分之间有空格,并且要求#和指令的其余部分不能有空格。
指令的定义域从指令的开始直到文件的末尾 定义符号常量或明显常量预处理器指令从#开始,到其后第一个换行符为止,指令的长度限于一行代码
/*简单的预处理器的例子*/
#include<stdio.h>
#define TWO 2
#define OW "Consistency is the last refuge of the unimagina\
tive. -Oscar Wilde" /*反斜线把这个定义延续到下一行*/
#define FOUR TWO*TWO
#define PX printf("X is %d.\n",x)
#define FMT "X is %d.\n"
int main(void)
{
int x=TWO;
PX;
x=FOUR;
printf(FMT,x);
printf("%s\n",OW);
printf("TWO:OW\n");
return 0;
}
每个#define行有三部分组成 第一部分指令为#define自身。第二部分为所选择的缩略语,这些缩略语称为宏 宏的名字之间不允许有空格,而且必须遵循命名规则:只能使用字母数字下划线(第一个不能用数字开头)。第三部分称为替换列表或主体,从宏变为最终的替换文本的过程称为宏展开
#define PX printf("x is %d.\n",x);
预处理 宏 主体
预处理器不进行计算,他只是按照指令进行文字替换操作
宏定义中可以含有其他宏
语言符号
系统把宏的主体当作语言符号(token)类型字符串,而不是字符型字符串
在#define中使用参数 ,可以创建外形和作用都相似的类函数宏,宏的参数也用圆括号括起来
下面是一个类函数宏定义的示例:
#define SQUARE(x) x*x
在程序中可以这样使用 z=SQUARE(2); //z=4
/**mac_arg.c 带有参数的宏*/
#include<stdio.h>
#define SQUARE(x) x*x
#define PR(X) printf("The result is %d.\n",X)
int main(void)
{
int x=4;
int z;
printf("x=%d\n",x);
z=SQUARE(x);
printf("Evluating SQUARE(x):");
PR(z);
z=SQUARE(2);
printf("Evluating SQUARE(2):");
PR(z);
printf("Evluating SQUARE(x+2):");
PR(SQUARE(2+x));
printf("Evluating 100/SQUARE(2):");
PR(100/SQUARE(2));
printf("x is %d.\n",x);
printf("Evluating SQUARE(++x):");
PR(SQUARE(++x));
printf("After incrementing,x is %x.\n",x);
return 0;
}
typedef简介
typedef工具是一种高级数据特性,他使用户能够为某一类型创建用户的名字,与#define有三个不同之处
- 与define不同,typedef给出的符号名称仅限于对类型,而不是对值。
- 解释由编译器进行,而不是预处理器执行
- 虽然他的范围有限,但在其受限范围内,typedef比#define灵活