【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. 转义字符

相关推荐
南棱笑笑生5 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
2601_9622959911 小时前
嵌入式开发语言用哪个最好,C,python或者其他
c语言·python·嵌入式开发·开发效率·系统资源
是隼人14 小时前
buuctf-pwn [HarekazeCTF2019]baby_rop2(64位ret2libc)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
wuyk55515 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
AAA代码批发商17 小时前
Days 39 Linux C 开发之 SQLite 数据库完整学习笔记
linux·c语言·数据库
卢锡荣19 小时前
单芯掌控多口互联|乐得瑞 LDR6020 PD3.1 多通道 Type‑C 控制 SOC 芯片
c语言·开发语言
wuminyu19 小时前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
susplus19 小时前
【HTTP协议】HTTP介绍及基础【C语言爬虫实现】
c语言·爬虫·http·万维网
xx~t20 小时前
嵌入式——Linux软件编程——数据库
linux·c语言·数据库·oracle·sqlite
水饺编程20 小时前
第5章,[Win32 章节] :圆角矩形教学插图绘制程序
c语言·c++·windows·visual studio