printf () 格式化输出
格式化占位符
int main() { printf("%d\n", 100); //%d输出十进制,int 整形 printf("%c\n", 65); //%c 输出 ascll码对应的字符 printf("%c\n", 'W'); printf("%lf\n", 3.5); //%lf适配 double 双精度浮点数 printf("%f\n", 3.6f); //%f 适配 float 单精度浮点数 return 0; }
C 语言核心知识点
字符常量
- 'A'、'0'、'\n' 都是字符常量,必须用单引号
- 双引号 "A" 是字符串,和字符完全不一样
- 字符 0 和整形 0 不同,字符 0 对应的asccll码值是48
ASCII 编码
- 在 C 语言里字符本质就是整数,每个字符对应一个 ASCII 编号
- 字符 A~Z 的 ASCII 码值从 65~90
- 字符 a~z 的 ASCII 码值从 97~122
- 对应的大小写字符 (a 和 A) 的 ASCII 码值的差值是 32
- 数字字符 0~9 的 ASCII 码值从 48~57
- 换行 \n 的 ASCII 值是:10
- 在这些字符中 ASCII 码值从 0~31 这 32 个字符是不可打印字符,无法打印在屏幕上观察;
格式化输出 printf 格式控制符
%c:输出字符,把整数当成 ASCII 码显示成文字
%d:输出十进制整数,打印字符对应的 ASCII 数值
printf("%d\n", 'A'); // 字符的底层是数字 ascll码值65对应的是A
printf("%c\n", 65); //原理同上字符可以做数学运算
大写字母 + 32 → 小写字母
'A' + 32 = 65+32 = 97 = 'a'小写字母 − 32 → 大写字母
'a' - 32 = 97-32 = 65 = 'A'
printf("%c\n", 'A' + 32); //输出 a printf("%c\n", 'a' - 32); //输出 A //printf("%c\n", 'A'); //字符A的ascll 码值为 65 //printf("%c\n", 'A' + 32); //printf("%d\n", '\n');// '\n' 的ascll码值 为10 //printf("%d\n", 'A'); // 字符的底层是数字 ascll码值65对应的是A //printf("%c\n", 65); //原理同上
字符,字符串
单引号 = 字符常量
- 只能存放1 个字符
- 格式:%c
双引号 = 字符串
字符串末尾会自动隐藏 \0 结束符
打印字符串格式化符号:%s
int main()
{
//字符
char ch = 'c';
printf("%c\n", ch);
printf("%c\n", 'Y');
//字符串 char str[] = "abcd"; //字符串包含 \0 printf("%s\n", str); printf("Yes\n"); printf("%s\n", "Yes"); return 0;}
字符串初始化
双引号字符串字面量
char arr1\[\] = "abc";
双引号字符串字面量,编译器自动在末尾追加 \0(字符串结束符)大括号逐个字符初始化
char arr2\[\] = {'a','b','c','\0'};
大括号逐个字符初始化,不会自动补\0,需要手动写
注意:字符串初始化时需要加上 字符串结束符( \0 ) ,否则会乱码strlen 与 sizeof 核心知识点
本质区别
strlen靠\0停止,如果找不到\0,就会一直向后读内存,结果随机,属于未定义行为。
char str1[] = "acd";// a b c \0 //字符串包含\0 char str2[] = { 'a','c','d','\0' }; //这种字符串的初始化,不包含\0需要我们自己加 printf("%s\n", str1); printf("%s\n", str2); //数组总字节大小 //strlen 是计算字符的有效个个数,不算字符串的结束标志\0 printf("strlen(str1):%d\n", strlen(str1)); printf("strlen(str2):%d\n", strlen(str2)); // sizeof 计算字符的总数时,会把\0 算进去 printf("sizeof(str1): %d\n", sizeof(str1)); printf("sizeof(str2): %d\n", sizeof(str2));
重点坑:数组传参变成指针
在函数内部,sizeof 得不到原数组大小,因为数组变成指针。
//数组传参变成指针 void test(char arr[]) { //arr 不是数组,是char*指针 printf("sizof(arr):%d\n", sizeof(arr)); //指针大小64位环境是8 printf("strlen(arr):%d\n", strlen(arr)); } int main() { char arr[] = "abc"; printf("main函数-》sizeof(arr):%d\n", sizeof(arr)); test(arr); return 0; }char * 字符串常量
sizeof(p)求的是指针变量的大小,不是字符串长度。
char *p = "abc"; printf("sizeof(p):%d\n", sizeof(p)); //sizeof 求指针变量大小,不是字符串长度 printf("strlen(p):%d\n", strlen(p));带空格的字符串
空格是普通有效字符,会被 strlen 计数,只有\0才算结束。
char arr[] = "a b c"; printf("sizof(arr):%d\n", sizeof(arr)); printf("strlen(arr):%d\n", strlen(arr));总结
- sizeof:算内存大小,看得见\0,数组多大算多大;数组传参变指针,得到的是指针大小。
- strlen:算字符串字符个数,看不见\0;必须要有\0,否则结果乱码随机。
- "字符串"双引号自动补\0;{}大括号初始化不会自动补。
字符串转义字符
- 转义字符小表
- 一个**\** 在代码里是转义符;想要输出屏幕上看到一个反斜杠,代码必须写两个 \\
代码里多写一个反斜杠,用来转义,屏幕才会输出一个反斜杠。引号想要出现在字符串里面,必须转义。
//转义字符 int main() { printf("%c\n", 'a'); printf("%c\n", '\"'); //双引号 printf("%c\n", '\'');//单引号 printf("abc\\nedef"); // \\是一个 斜杠\ printf("\n"); printf("abc\nbced"); //\n 换行 printf("abc\\\nbeccd"); // 一个斜杠加换行 return 0; }
\\ 输出路径
\\ → 打印一个\
// \\ --》 一个反斜杠 用来打印路径 //printf("C\\test\\net\\haha.c"); 得到的结果 C\test\net\haha.c\a 响铃
\a:警报,蜂鸣 / 提示音,屏幕不输出字符,电脑发出滴的一声。
\b 退格
\b:光标回退一格,不是删除字符,只是光标往左挪一格。
abcdef之后光标在 f 后面,\b光标挪到 f 上面,后面输出qwe会把f覆盖。
输出:abcdeqwe
printf("abcdef\bqwe");\r 回车
\r:光标回到本行开头,不换行。
abcdef打印完,光标跳回行首。如果后面继续输出内容,会覆盖前面的文字。
printf("123456\rabc"); //输出:abc456\t 水平制表符 tab
tab 的规则:跳到下一个 tab 位置,tab 位默认 8 列
每 8 个字符为一个 tab 停靠点:0‑7,8‑15,16‑23......
\t不是输出 4/8 个空格字符,是移动光标到下一个制表位。
转义字符





