5. 字符串+转义字符+注释
5.1 字符串
"hello world\n"这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
#include <stdio.h> #include <string.h> int main() { printf("hello bit\n"); char arr1[] = "abc";//[]中是这个数组内有多少个字符,因此此处是4,因为\0算作一个字符,而字符串的结束标志是一个 \0 的转义字符。 char arr2[] = { 'a', 'b', 'c', '\0' };//[]中是这个数组内有多少个字符,因此此处是4。 //string length 字符串长度 //strlen是库函数,是专门求字符串长度的函数;所以在一开始要加上#include <string.h> printf("%d\n", strlen(arr1));//3 printf("%d\n", strlen(arr2));//3 printf("%s\n", arr1);//%s是打印字符串,遇到\0打印自然结束 printf("%s\n", arr2); return 0; }
tips:
(i)\0算作一个字符
(ii)字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
5.2 转义字符
假如我们要在屏幕上打印一个目录: c:\code\test.c,我们该如何写代码?
#include <stdio.h> int main() { printf("c:\code\test.c\n"); return 0; }
但实际上程序运行的结果是这样的:
这里就不得不提一下转义字符了,转义字符顾名思义就是转变意思。
下面我们就来看一些转义字符:
转义字符 | 释义 |
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\’ | 用于表示字符常量’ |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 清屏并换页符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字 |
\xdd | dd表示2个十六进制数字 |
- 问题1:如何打印(are you ok??)
#include <stdio.h> int main() { printf("(are you ok??)");//这样写实际打印出来是(are you ok] printf("(are you ok\?\?)");//这样写实际打印出来才是(are you ok??) return 0; }
附:
在ANSI C标准中,定义了9个三字母词(trigraph),三字母词就是几个字符的序列,合起来表示另一个字符。由于一些非常老式的键盘上没有[]{}#^~|这些字符,因此在C语言中规定了9个三字母词与其对应。
三字母词 | 对应的字符 |
??= | # |
??( | [ |
??) | ] |
??< | { |
??> | } |
??/ | / |
??! | | |
??’ | ^ |
??- | ~ |
- 问题2:如何打印’
#include <stdio.h> int main() { printf("%c\n",'\''); return 0; //%c - 打印字符,且是单个字符 //%d - 打印整型 //%f - 打印浮点数(小数) //%s - 打印字符串 }
- 问题3:如何打印"
#include <stdio.h> int main() { printf("%s\n","\""); return 0; }
- 问题4:如何打印c:\code\test.c
#include <stdio.h> int main() { printf("c:\\code\\test.c");//\t是一个转义字符,为了不让\是\t中的\,则需在\前再加一个\,以此来转义\;在一个路径里面你想要一个\,那就要写出两个\ return 0; }
- 问题5:\a的用法
#include <stdio.h> int main() { printf("\a"); return 0; }
- 问题6:\b的用法
- 问题7:\f的含义
终端在输出‘\f’之后内容之前,会将整个终端屏幕清空,然后在输出内容。由于现阶段用的还不是很多,所以不用过度纠结,先大致了解,等到学到Linux后就可以理解了。
- 问题8:\n的用法
- 问题9:\r的用法
此处\r所代表的回车与键盘上我们所用的回车键是有所区别的。\r的效果是输出回到本行行首,结果可能会将这一行之前的输出覆盖掉,也就是说,\r (要与\n区别开来,\n是换行的,而\r是不换行的)后边的数字替代这一行最开始的相等数目的数字。
#include <stdio.h> int main() { printf("123456\r789");//打印出来是789456 return 0; }
- 问题10:\t的用法
- 问题11:\v的用法
#include <stdio.h> int main() { printf("123\v456"); return 0; //打印出来是 //123 // 456 }
- 问题12:\ddd的用法
\ddd中的ddd表示1-3个八进制的数字。130这个8进制数字转成10进制数字,作为ASCII码值,表示的字符就是‘X’。
附:
- 问题13:\xdd的用法
\xdd中的dd表示2个十六进制数字。30这个16进制数字转成10进制数字,作为ASCII码值,表示的字符就是‘0’。
附:
5.3 注释
- 代码中有不需要的代码可以直接删除,也可以注释掉
- 代码中有些代码比较难懂,可以加一下注释文字
注释有两种风格:
- C语言风格的注释 :/*xxxxxx*/(缺陷:不能嵌套注释)
- C++风格的注释 //xxxxxxxx(推荐,可以注释一行也可以注释多行)
6. 选择语句
#include <stdio.h> int main() { int input = 0; printf("要好好学习吗?(1/0)"); scanf("%d", &input); if(input == 1) { printf("好offer\n"); } else if(input == 0) { printf("卖红薯\n"); } return 0; }
7. 循环语句
C语言中如何实现循环呢?
- while语句
- for语句(后期讲)
- do … while语句(后期讲)
#include <stdio.h> int main() { int line = 0; while (line < 20000) { printf("写代码:%d\n", line); line++; } if (line == 20000) printf("好offer\n"); return 0; }
8. 函数
函数的特点就是简化代码,代码复用。
9. 数组
9.1 数组定义
要存储1-10的数字,怎么存储?
C语言中给了数组的定义:一组相同类型元素的集合
int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素 int arr1[10] = {1,2,3};//不完全初始化,只初始化前3个,剩余的初始化为0 int arr2[10];//这样写也是可以的,只是数组中的值是随机值 int arr3[] = {1,2,3};//这样写也是可以的,[]中默认是3 int arr4[];//这样写是错误的 int n = 10; int arr[n];//C99标准中 变长数组,允许数组在创建的时候,数组大小用变量指定,但是这种数组不能初始化 return 0; }
9.2 数组的下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。数组可以通过下标来访问。
#include <stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; printf("%d\n", arr[8]);//打印出来是9 return 0; }
附:
int arr[10] = {1,2,3,4,5,6,7,8,9,10} | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
9.3 数组的使用
#include <stdio.h> int main() { int arr[10]; //输入0~9 int j = 0; while (j < 10) { scanf("%d", &arr[j]); j++; } //输出0~9 int i = 0; while (i < 10) { printf("%d ", arr[i]); i++; } return 0; }