【C】C语言常见概念

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;

    }

字符串初始化

  1. 双引号字符串字面量
    char arr1\[\] = "abc";
    双引号字符串字面量,编译器自动在末尾追加 \0(字符串结束符)

  2. 大括号逐个字符初始化
    char arr2\[\] = {'a','b','c','\0'};
    大括号逐个字符初始化,不会自动补\0,需要手动写
    注意:字符串初始化时需要加上 字符串结束符( \0 ) ,否则会乱码

  3. 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));

总结

  1. sizeof:算内存大小,看得见\0,数组多大算多大;数组传参变指针,得到的是指针大小。
  2. strlen:算字符串字符个数,看不见\0;必须要有\0,否则结果乱码随机。
  3. "字符串"双引号自动补\0;{}大括号初始化不会自动补。

字符串转义字符

  1. 转义字符小表
  2. 一个**\** 在代码里是转义符;想要输出屏幕上看到一个反斜杠,代码必须写两个 \\
    代码里多写一个反斜杠,用来转义,屏幕才会输出一个反斜杠。引号想要出现在字符串里面,必须转义。
复制代码
   //转义字符
   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; 
   }
  1. \\ 输出路径
    \\ → 打印一个\

    复制代码
    	// \\  --》 一个反斜杠 用来打印路径
    	//printf("C\\test\\net\\haha.c");
    得到的结果 C\test\net\haha.c
  2. \a 响铃

    \a:警报,蜂鸣 / 提示音,屏幕不输出字符,电脑发出滴的一声。

  3. \b 退格

    \b:光标回退一格,不是删除字符,只是光标往左挪一格。

    abcdef之后光标在 f 后面,\b光标挪到 f 上面,后面输出qwe会把f覆盖。

    输出:abcdeqwe

    复制代码
    printf("abcdef\bqwe");
  4. \r 回车

    \r:光标回到本行开头,不换行。

    abcdef打印完,光标跳回行首。如果后面继续输出内容,会覆盖前面的文字。

    复制代码
    printf("123456\rabc");
    //输出:abc456
  5. \t 水平制表符 tab

    tab 的规则:跳到下一个 tab 位置,tab 位默认 8 列

    每 8 个字符为一个 tab 停靠点:0‑7,8‑15,16‑23......

    \t不是输出 4/8 个空格字符,是移动光标到下一个制表位。

  6. 转义字符

相关推荐
嵌入式阿蔡3 小时前
CAN总线入门:从协议帧到STM32实战
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
LONGZETECH4 小时前
无人机组装调试实训高损耗痛点分析与虚拟仿真教学落地方案
c语言·开发语言·架构·无人机
luj_17685 小时前
大航海时代:沉浸式财商实战沙盒
c语言·开发语言·网络·经验分享·算法
Navigator_Z5 小时前
LeetCode //C - 1200. Minimum Absolute Difference
c语言·算法·leetcode
LuminousCPP5 小时前
数据结构基础篇(二):顺序表与链表全方位对比|从内存布局到 CPU 缓存理解底层差异
c语言·数据结构·经验分享·链表·缓存
Hello_Damon_Nikola7 小时前
CH573从入门到精通
c语言·开发语言·单片机·嵌入式硬件
Chen—LSN8 小时前
C语言——数据在内存中的存储
c语言·开发语言·经验分享·笔记
luj_17688 小时前
财商游戏三大核心维度设计
c语言·开发语言·网络·经验分享·算法
caimouse8 小时前
ReactOS 图形系统分析(24):指针(光标)管理 — mouse.c/h
c语言·开发语言