4. 字符串+转义字符
4.1 字符
我们在键盘上敲出来的所有东西都可以理解为字符,字符一般用单引号' '来表示。
字符的使用
1. #include<stdio.h> 2. int main() 3. { 4. char ch = 'a'; 5. ch = 'x'; 6. printf("%c", ch); 7. return 0; 8. }
字符的本质:ASCII码值
ASCII码值小科普
计算机中存储,表示都是二进制的,早期科学家们,为了区别字符,给每个字符都编了号,这个编码就称为ASCII码值。
Tips:常见的一些ASCII码值我们可以把它背下来,如0 - 48,a - 97, A - 65等等....
4.2 字符串
字符串是什么
这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。("hello anduin.\n","a"," "这些都是字符串)。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
字符串的使用
1. #include<stdio.h> 2. int main() 3. { 4. char arr[] = "abcd"; 5. printf("%s\n",arr); 6. return 0; 7. }
隐藏的' \0 '
1. #include<stdio.h> 2. int main() 3. { 4. char arr1[] = "abcd";//此处可以结合内存来说明 5. char arr2[] = {'a', 'b', 'c', 'd'}; 6. return 0; 7. }
接下来我们启动调试,查看arr1,arr2的内容。
在arr1的结尾处隐藏着一个'\0'作为结束字符串的标志,但是arr2中却没有' \0 '。
' \0 ' 的威力
别看上述例子只是少了一个' \0 ',在这里' \0 '并不是摆设,它也是有自己的“威力”的。
在我们用代码看它的作用之前让我们先了解一下strlen函数。
strlen是一个库函数,在使用时需要引用头文件#include<string.h>
函数作用:用来求字符串长度。
#include<stdio.h> #include<string.h> int main() { char arr1[] = "abcd"; char arr2[] = {'a','b','c','d'}; printf("%d\n",strlen(arr1)); printf("%d\n",strlen(arr2));//可以画图详细讲解 }
这里的输出结果是什么???让我们开始运行,我们看到结果如下:
我们不禁产生疑问,34是哪来的?原来这都是'\0'一手导致的。
分析:’\0'仅仅是字符串结束的标志,在统计长度时,并不会加上\0一起计算
故输出arr1的长度为4,由于arr2中没有\0,在求字符串由于\0并没有出现,所以便一直向后计算,直到遇到\0,这里面的长度也是包含了我们之前出现的烫烫烫的个数的!!!
所以'\0'的威力还是很大的。
小思考
如何输出这个路径?D:\Anduin_code\anduins-code-warehouse
这样可以吗?
int main() { printf("D:\Anduin_code\anduins-code-warehouse"); //输出结果:D:Anduin_codenduins-code-warehouse }
但当我们运行之后,发现我们并不能输出我们的路径,这是为什么?因为这里\和其他字符构成转义字符。
4.3 转义字符
转义字符,通俗点来讲就是在所有ASCII码前都可以用\加数字来表示,如\0,\t,\n等等,都可以被称作为转义字符。转义字符顾名思义就是转变意思。
下面我列出了一些转义字符:
转义字符 |
释义 |
\? |
在书写连续多个问号时使用,防止他们被解析成三字母词 |
\' |
用于表达字符常量 |
\" |
用于表示一个字符串内部的双引号 |
\\ |
用于表示一个反斜杠,防止他被解释为一个转义序列符 |
\a |
警告字符,蜂鸣 |
\b |
退格符 |
\f |
进纸符 |
\n |
换行 |
\r |
回车 |
\t |
水平制表符 |
\v |
垂直制表符 |
\ddd |
ddd表示1 - 3个八进制数字。如:\130x |
\xdd |
dd表示2个十六进制数字。如:\x30 0 |
让我们用代码了解他们都是什么作用(详情见注释):
int main() { printf("%s\n","(are you ok??)");//在老编译器上会打印(are you ok] //三字母词:??) ->] printf("%c\n",'\'');//输出结果为:' printf("%c\n","\"");//输出结果为:" printf("\a\a\a");//蜂鸣,电脑叫三声 char a[] = "abc"; printf("%c%c\b%c", a[0], a[1], a[2]);//输出结果为:ac(\b为退格符,b被删掉) printf("1\t23");//输出结果为:1 23(\t是水平制表符,八个空格) printf("anudin\n");//输出结果为:anduin且换行 printf("%c\n",'\130');//输出结果为:X (1*64+3*8+0*1 = 88 也就是字符 X) printf("%c\n",'\x30');//输出结果为:0 (3*16+0*1 = 48 也就是字符 0) }
小测验
看到这儿大家应该对转义字符有一定的理解了,接下来就用几道题目来测验一下自己吧:
题1:如何正确输出代码路径:D:\Anduin_code\anduins-code-warehouse?
题2:这个路径的长度是多少?
#include<stdio.h> int main() { printf("D:\\Anduin_code\\anduins-code-warehouse?"); printf("%d\n",strlen("D:\Anduin_code\anduins-code-warehouse")); return 0; }
揭晓答案:
5. 注释
注释的作用
1)代码中不需要的代码可以直接删除,也可以注释掉。
2)代码中代码比较难懂,可以加注释文字。
注释风格
1. #include<stdio.h> 2. int main() 3. { 4. //printf("hello anduin\n");C++注释风格 推荐 5. /* C语言风格注释 不推荐 6. printf("oops!\n"); 7. */ 8. }
C语言注释风格由于\*总是和更近的*/进行匹配,从而导致无法嵌套注释,所以我们一般还是用C++风格的注释。
6.选择语句
我们的生活处处都有选择,在C语言中也不例外,存在着选择语句。
举一个比较简单的例子:如果你坚持好好学习,那么以后可能会收获一份好offer。
但是如果你不好好学习,那你可能会被社会淘汰。
代码演示:
int main() { int studying = 0; printf("你会坚持每天学习吗?(1 or 0):>"); scanf("%d",&studying); if(studying == 1) { printf("好offer在等着你!\n"); } else { printf("竹篮打水一场空!\n"); }
对于你,你会怎么选择呢?是选择1 好offer,还是选择 0 竹篮打水一场空呢?
anduin这里还是建议大家努力起来,一起加油!
当然分支语句可不仅仅是这么点,我们今天只是了解,等之后会我会重新整理的。
7.循环语句
有些事必须一直做,比如我们日复一日的学习敲代码。
这也就形成了一种循环,C语言中有一种语句叫做循环语句,我们接下来就来了解一下它,循环语句分为三种:
- while语句
- for语句
- do...while语句
我们今天就重点看一下while语句,其他两种循环语句,我会在以后详细讲解:
while(表达式)
循环语句;
我们可以通过一个例子来了解一下while语句是如何进行的,比如你坚持写代码,当你代码写到两万行时,你可能觉得你的水平差不多了,也可以找个offer了,那么这个循环也就随之结束。如下面代码所示:
#include<stdio.h> int main() { int line = 0; printf("insist codeing >\n"); while(line < 20000) { printf("写代码\n"); line++; } if(line == 20000) { printf("好offer\n"); } return 0; }
编译运行结果为:(因为这里代码过多就截取一小部分)。
8.函数
如何理解
在我们学习数学的时候,也学过函数,它们表示为f(x),C语言中也存在着函数。
程序中存在main函数,那么除了main函数可不可以编写其他的函数呢?可以!!!
函数的结构
实现Add函数
#include<stdio.h> int Add(int x,int y) { return (x + y); } int main() { int num1 = 0; int num2 = 0; int sum = 0; scanf("%d%d",&num1,&num2); sum = Add(num1,num2); printf("%d\n",sum); }
分析:用sum来接受Add函数所返回的值的同时调用Add函数,于是num1和num2在进行Add函数计算后,返回值为num1 + num2的值。
为什么使用函数
想象一下,如果这边有很多组数据要想加,使用平时的思路,我们需要初始化很多次,代码冗长,不美观,效率低,但是如果我们封装一个函数,可以达到事半功倍的效果。
9. 数组
如果要存储1-10的数字,怎么存储?
使用数组。
C语言中给了数组的定义:一组相同类型元素的集合
9.1 数组定义
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义一个整形数组
char ch[5] = { 0 };//对char类型数组不完全初始化,其中元素默认被初始化为0
char ch2[] = {'a','b','c'};//这样也正确
char ch3[] = { 0 };//正确,元素个数为1个,元素为\0
9.2 数组的下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组是通过下标来访问的。
代码演示:
#include<stdio.h> int main() { int arr[5] = { 1, 2, 3, 4, 5}; printf("%d\n",arr[3]);//访问下标为3的元素 //printf("%d\n",arr[10])//不可以这样访问!!! }
请注意数组不能越界访问,例如:arr[10]就越界访问了!!!越界访问可能会导致程序崩溃,程序出错等严重后果。
设想一下:你在一层楼中买了两套房子,但是你自己的房子不住,偏偏要去住别人的房子,这是什么,这就是非法访问,严重的是要被抓起来了,就说明你违法了!!!所以越界访问的危险可见一斑。
9.3 数组的使用
#include<stdio.h> int main() { int arr[10] = { 0 }; //0~9 //输入10个值给数组 int i =0; while(i<10) { scanf("%d",&arr[i]); i++; } //输出数组的10个值 i = 0; while(i<10) { printf("%d ",arr[i]); i++; } return 0; }