当前位置:网站首页>C语言(字符串,转义字符,关键字)
C语言(字符串,转义字符,关键字)
2022-07-30 05:39:00 【代码陈帅】
一、字符串
1、什么是字符串
字符:‘a’ ‘@’
字符串:“abc” “hello world”
这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
2、举个例子
#include<stdio.h>
#include<string.h> //strlen函数的头文件
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a', 'b', 'c',};
printf("%d\n", strlen(arr1)); //输出3
printf("%d\n", strlen(arr2)); //输出随机值
printf("%s\n",arr1);
printf("%s\n",arr2);
return 0;
}这样写的话打印结果会完全不一样,打印结果如图:

为什么第二个arr2abc后面会打印出这么多文字呢?
这是因为arr1中字符串abc后面隐藏一个\0结束标志,而arr2中是三个字符没有\0,因此要它停下来需要往后寻找,所以产生随机值。如何修改呢,就是要在后面添加一个\0,来表示结束位。
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a', 'b', 'c', };
char arr3[] = { 'a','b','c','\0'};
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
printf("%d\n", strlen(arr3));
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}结果如图:

注意:
1.strlen的作用是计算字符串在内存中所占的空间大小,需要#include<string.h>这个头文件去包含。上个文章用到了sizeof,sizeof是用来计算变量或者使用类型创建的变量的大小,单位是字节。
2.%s打印字符串,%c打印字符。
二、转义字符
1、什么是转义字符:
转义字符是指,用一些普通字符的组合来代替一些特殊字符,由于其组合改变了原来字符表示的含义,因此称为“转义”。
比如 C 语言中,用“\n”来表示换行,“\r”表示回车,“\t”表示跳格等等,它们本身只是一个反斜杠和一个字母,但是却被赋予了特殊的意义
我们先来看一下这一段代码打印的是什么:
#include<stdio.h>
int main()
{
printf("c:\code\test.c");
return 0;
}这个打印的就是 : c: code est.c ‘\t’就是转义字符。
转义顾名思义就是转变意思。上述实例\c、因为c本身不是转义字符,所以输出本身;\t代表水平制表符,所以不输出c:\code\test.c
printf("(hehe\?\?)"); //打印(hehe??)
printf("%c",'\''); //打印'
printf("%s","\""); //打印"
printf("c:\\test\\104\\test.c"); //打印c:\test\104\test.c
printf("\a\a\a\a"); //电脑蜂鸣
printf("%c\n", '\130'); //8进制的130转化成十进制数88作为ASCLL值所对应的符号:X
printf("%c\n", '\x40'); //16进制的40转化成十进制数64作为ASCLL值所对应的符号: @2、看一道计算题:
#inlude<stdio.h>
#include<string.h>
int main(){
printf("%d\n", strlen("c:\test\628\test.c"));
//\62被解析成一个转义字符
return 0;
}该程序输出什么呢?
输出14 分别为是:c,:,\t,e,s,t,\62,8,\t,e,s,t,.,c
注意:1、8进制没有8
2、转义字符整体算做一个字符。
\ddd: ddd表示1~3个八进制的数字 如:\130 x
\xdd: dd表示2个十六进制数字 如:\x40 @ 其他转义字符就不一一列举了
三、关键字
关键字有很多,我就举出常用的几个:
1关键字register
(1)拓展
在介绍关键字 register 之前,我们先了解一下计算机中数据的存储,计算机的储存单元为:寄存器——>内存——>硬盘,在计算机中为了适配CPU的处理速度出现了寄存器,在计算机的存储单元中,寄存器的读写速度是最快的。我们现在需要了解的是:CPU 并不会直接和每⼀种存储器设备直接打交道,而是每⼀种存储器设备只和它相邻的存储器设备打交道。当然了,话说回来,我们现在只需要知道在计算机的存储单元中,寄存器的读写速度是最快的。
(2)关键字register的简单使用
现在我们已经知道寄存器的读写速度是非常快的,因此当我们想要处理大量且频繁被使用的数据时,就可以将其放到寄存器中,从而提高处理效率。例如下面代码:
#include<stdio.h>
int main()
{
//假设num被频繁的使用
register int num=10000;//将num放到寄存器中,提升效率
return 0;
}2、关键字typedef
typedef,顾名思义就是类型重定义的意思,即把一个类型的名字定义成一个新名字,当需要多次输入一个相同类型时,typedef提供了很好的便携性。
typedef unsigned int unit; //我们通过重命名,将unsigned int命名为unit
int main()
{
unsigned int num1 = 10;
unit num2 = 20;
//num1与num2类型一样
return 0;
}
unsigned int,是无符号整型的意思。unsigned的取值范围在0-2^32。不能表示负数。每一种整型(int short long longlong)都有无符号(unsigned)和有符号(signed)两种类型,在一般情况下的整型变量都是有符号的,如果需声明无符号的话就会在类型前加上unsigned。
3关键字static
在c语言中:static是修饰变量和函数的,它主要三种使用形式:
(1)修饰局部变量——称为静态局部变量
void test()
{
int a = 1;
++a;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 5)
{
test();
i++;
}
return 0;
}这个的输出结果是:2 2 2 2 2
void test()
{
static int a = 1;
++a;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 5)
{
test();
i++;
}
return 0;
}这个的输出结果是 2 3 4 5 6,为什么int前面加上了static输出结果不一样了呢,这里就引出了static修饰局部变量的作用:
我们现在要说一下局部变量生命周期是什么:从进入作用域生命周期开始,出作用域生命周期结束。因此,程序1每次调用test函数都要经历变量的创建和销毁,所以每次打印出a的值都是2(1+1)。而对于程序2,test函数中的a变量被static修饰,而static关键字的作用是改变局部变量的生命周期。也就是说变量a的生命周期不在局限在test函数内部,而是整个程序,因此调用test函数a变量只创建一次,在程序结束时才会销毁,因此循环五次输出2,3,4,5,6
结论:普通的局部变量是存储在栈区的,被static修饰的变量是存储在静态区的,static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。(本质上:改变了变量的储存类型)
(2)修饰全局变量——称为静态全局变量
我们已知全局变量的作用域是整个工程,调整整个工程中任何地方都能使用:

但是当我们用static关键字修饰全局变量,使得这个全局变量只能在本源文件中使用,在其他源文件中使用就会报错:

结论:一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用,这个全局变量只能在自己的.c文件中看到,其他源文件看不到了(本质上:是因为全局变量具有外部连接属性,被static修饰后就变成了内部连接属性)。
(3)修饰函数——称为静态函数
其实static修饰全局变量和修饰函数原理的原理相同,详见下图:

在int前面加上static,再来运行,就会报错:
结论:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用(本质上:static是将函数的外部链接属性变成了内部链接属性)
static就是使自己创建的全局变量与函数只能使自己看到与调用,不希望其他人调用。
这就是我这几天总结的知识,希望对大家有帮助。
边栏推荐
- Summary of SQL classic interview questions in 2022 (with analysis)
- Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
- Memories · The last system design in the university era
- MySQL 数据库基础知识(系统化一篇入门)
- PyCharm使用教程(较详细,图+文)
- 留念 · 大学时代最后的系统设计图
- It is enough for MySQL to have this article (37k words, just like Bojun!!!)
- 多线程并发服务器
- 爬虫数据是如何收集和整理的?
- k折交叉验证(k-fold Cross-validation)
猜你喜欢

个人博客系统(附源码)

argparse —— 命令行选项、参数和子命令解析器

Anaconda安装教程

C语言指针(指针数组、数组指针、函数指针、传参、回调函数等)超详细

Different lower_case_table_names settings for server ('1') and data dictionary ('0') solution

flask的笔记

手把手教你设计一个CSDN系统

navicat连接MySQL报错:1045 - Access denied for user ‘root‘@‘localhost‘ (using password YES)

665.非递减数列

mysql time field is set to current time by default
随机推荐
Falling ants (Peking University entrance exam questions)
Different usage scenarios of subqueries as retrieval tables and the question of whether to add aliases
MySql fuzzy query Daquan
np.where()用法
【图像检测】基于灰度图像的积累加权边缘检测方法研究附matlab代码
flask-socketio实现的网页聊天室(一)
pytorch中的线性代数
cJSON开源项目详细解剖
[Koltin Flow (2)] The end operator of the Flow operator
934.最短的桥(广度优先搜索)
torch.optim.Adam()
Qt实现单击或双击QTableWidge/View表头进行排序
np.argsort()函数详细解析
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
51.N皇后(回溯法)
5.6EPOLLONESHOT事件
SOA(面向服务架构)是什么?
[Mysql] DATEDIFF function
ezTrack-master使用教程
Navicat cannot connect to mysql super detailed processing method