一、标准输入输出函数
1. 字符输入输出:getchar和putchar
这两个函数是最基本的输入输出函数,用于单个字符的读取和显示。
int getchar(void); // 从键盘获取一个字符
int putchar(int c); // 向终端输出一个字符
示例:
char ch = getchar(); // 读取一个字符
putchar(ch); // 输出这个字符
putchar('A'); // 直接输出字符'A'
putchar(65); // 输出ASCII码为65的字符(即'A')
2. 格式化输入输出:printf和scanf
printf函数
printf函数用于格式化输出,其基本语法为:
int printf(const char *format, ...);
格式:
printf("格式控制字符串",输出的参数列表);
数据类型的格式控制
- 整型数据格式控制
%d - 有符号十进制整数
例如: printf("%d", -42); // 输出: -42
%u - 无符号十进制整数
例如: printf("%u", 42); // 输出: 42
%x/%X - 十六进制整数
例如: printf("%x", 255); // 输出: ff
printf("%X", 255); // 输出: FF
%o - 八进制整数
例如: printf("%o", 64); // 输出: 100
- 浮点型数据格式控制
%f - 小数形式
例如: printf("%f", 3.14159); // 输出: 3.141590
%e - 科学计数法
例如: printf("%e", 3141.59); // 输出: 3.141590e+03
%g - 简洁输出(自动选择%f或%e)
例如: printf("%g", 3.14); // 输出: 3.14
- 字符型数据格式控制
%c - 单个字符
例如: printf("%c", 65); // 输出: A
%s - 字符串
例如: printf("%s", "Hello"); // 输出: Hello
辅助控制符的使用
- #号前缀控制
printf("%#x", 255); // 输出: 0xff
printf("%#o", 64); // 输出: 0100
- 宽度控制(m)
printf("%5d", 42); // 输出: " 42" (右对齐)
printf("%-5d", 42); // 输出: "42 " (左对齐)
printf("%05d", 42); // 输出: "00042" (用0填充)
- 精度控制(.n)
printf("%.2f", 3.14159); // 输出: 3.14
printf("%.3s", "Hello"); // 输出: Hel
- 长度修饰符
printf("%ld", 123456789L); // 长整型
printf("%lld", 123456789123LL); // 长长整型
printf("%hd", 32767); // 短整型
printf("%hhd", 127); // char类型
printf("%Lf", 3.14159265358979L); // 长双精度
注意:
- 占位符和参数的对应关系必须严格匹配:
// 正确使用
printf("%d %d", 42, 52);
// 错误使用(参数过多)
printf("%d", 42, 52); // 警告但可运行
// 错误使用(参数不足)
printf("%d %d", 42); // 警告且可能输出随机值
- 格式控制符的组合使用:
// 组合使用宽度、精度和对齐控制
printf("%8.2f", 3.14159); // 输出: " 3.14"
printf("%-8.2f", 3.14159); // 输出: "3.14 "
scanf函数
scanf函数用于格式化输入,其基本语法为:
int scanf(const char *format, ...);
格式:
scanf("格式控制字符串",地址列表);
使用注意事项:
- scanf后面必须使用取地址符&(除非是数组名)
- scanf会被空白字符(空格、回车、制表符)分割输入
- scanf读取时会将输入存入缓冲区
示例:
int num;
float decimal;
scanf("%d %f", &num, &decimal);
编程小技巧
- 输入输出函数的缓冲区问题:当使用scanf读取字符时,注意处理多余的换行符,可以用getchar()消化掉。
二、流程控制
1. 关系运算符与逻辑运算符
关系运算符:
>
大于>=
大于等于<
小于<=
小于等于==
等于!=
不等于
逻辑运算符:
&&
逻辑与(一假则假)||
逻辑或(一真则真)!
逻辑非(真假相对)
关于真假的判断,这里有个重要的概念:
- C语言中任何非0的值都被认为是"真"
- 只有0被认为是"假"
因此,像2、-1、'a’这些都会被判断为"真"。
特别需要注意的是短路特性:
- 对于&&运算,如果左边为假,右边就不会再计算
- 对于||运算,如果左边为真,右边就不会再计算
2. if语句
单分支if语句:
if (表达式) {
// 条件为真时执行的代码
}
双分支if语句:
if (表达式) {
// 条件为真时执行的代码
} else {
// 条件为假时执行的代码
}
实际应用示例:找出两个数中的最大值
int main(void)
{
double num1,num2;
scanf("%lf%lf",&num1,&num2);
if (num1 > num2)
{
printf("最大值:%g\n",num1);
}else
{
printf("最大值:%g\n",num2);
}
return 0;
}
注意
- 不要在if后面直接加分号
- 即使只有一条语句,也建议使用大括号包围
- 条件表达式要用圆括号包围