字符串详解
定义
输入输出
思考一:
思考二:
思考三
字符串的转义字符
思考四
常见的字符串函数
strcpy 拷贝数组
strlen 输出字符串长度
strcat 连接俩个字符串
strcmp 比较俩个字符串的大小
strupr 把字符串里面的小写转换成大写形式
strlwr 把字符串里面的大写转换成小写形式
字符串数组
进阶 指针
指针使用:
常见误区:
思考五:
字符串详解
定义
C 语言没有单独的字符串类型,字符串被当作字符数组,即char
类型的数组
- char str[20]="helloworld";
- char str[20]={"hello"};
- char str[20]={'h','e','l','l','o'};
双引号是代表是一个字符串常量,单引号代表是一个字符常量。
编译器会给数组分配一段连续内存,所有字符储存在相邻的内存单元之中。在字符串结尾,C 语言会自动添加一个全是二进制0
的字节,写作'\0'
字符,表示字符串结束。字符'\0'
不同于字符0
,前者的 ASCII 码是0(二进制形式00000000
),后者的 ASCII 码是48(二进制形式00110000
)。
在定义时若是担心数组大小不够 可以用下面这种写法:
char s[]="hello,acm";
编译器会自动给大小 ,这个大小是刚好合适的 是10.
ASCII 码对照表
史上最全ASCII码对照表0-255(%d)-CSDN博客
输入输出
输入输出字符的时候 上面俩种写法是相同的
但是输入字符串的时候 scanf 和 gets 是有区别的
gets 的输入分隔符 只有回车,所以 gets 是能够读入空格的, gets 是可以读取到 空的回车的
scanf 输入分隔符 可以是回车也可以是 空格,scanf 是不能读取到 空的回车的。
puts 在输出字符串的时候 会给你自动加 回车符号
printf 不会自动加回车
思考一:
如果我输入 回车 回车 123 456 答案会是什么
思考二:
这样写算是对的吗? 如果是对的,那你觉得会输出什么呢
思考三
如果我想输入 123 和 'l' 的值 上面的这串代码能输入正常吗 ,如果不能,为什么。
字符串的转义字符
C语言——转义字符_c语言转义字符-CSDN博客
比较常用的转义字符:
- \n 回车
- \0 结束符
- \\ 输出一个\
- \0 开头 或者 \接1-3位数字 代表是8进制
- \x 开头 是十六进制数字 没有位数要求
思考四
下面的输出结果是什么 ,为什么
常见的字符串函数
strcpy 拷贝数组
用法:
strlen 输出字符串长度
和sizeof不同的是 strlen 是输出字符串长度 ,以 \0 作为结束符,sizeof 纯粹的是计算 占用的空间大小。char 类型 字符占用一个字节。
strcat 连接俩个字符串
strcmp 比较俩个字符串的大小
按照ASCII码来比较的。如果相等会返回 数字 0 ,因为编译器的不同 ,有些编译器小于的结果就是 -1 大于的结果就是 1 ,另外一些编译器返回的是 出现第一个不相同的字符的ASCII码的 相减的结果。
strupr 把字符串里面的小写转换成大写形式
strlwr 把字符串里面的大写转换成小写形式
字符串数组
如果一个数组的每个成员都是一个字符串,则需要通过二维的字符数组实现,每个字符串本身就是一个字符数组,多个字符串再组成一个数组。
定义
char str[10][20]={"hello","acm","!"};
只能省略 第一个中括号的数字 ,第二个不能省略。省略第二个参数会给你自动加,就像字符串会自动计算长度。
使用,正常和整形一维数组一样使用
进阶 指针
指针是什么?首先,它是一个值,这个值代表一个内存地址,因此指针相当于指向某个内存地址的路标。
*
这个符号除了表示指针以外,还可以作为运算符,用来取出指针变量所指向的内存地址里面的值。
&
运算符用来取出一个变量所在的内存地址
上面定义字符串还可以这样定义:
char *s="1234";
上面代表的是一个指针,指向字符串常量“1234”
下面这样定义的也是对的
我们在使用字符串变量的时候 比如 说这个
char a[20]="1234" 这个 a 是一个地址,但是这个a 不能修改地址,上面的 s 是可以的,因为 a 具体的 定义是 const char *a , 被const 修饰的值 是不能修改的,const 加在哪里,哪个位置就不能动。
指针一定要有指向才能使用,否则就是一个野指针。
上面是因为 a 是地址,所以可以直接指向
这个是因为 ch 是一个变量,而 p 只能被地址赋值,就需要使用地址符号来取出地址,来进行赋值
指针使用:
常见误区:
上面这段代码 因为指针并没有 指向,然后就被 强制要往里面塞值,可是指针本身是不能塞值的,只能依附于有内存空间的去操作,所以这里,编译不会出错,这个 s 是无值的
指针的东西很多,我这里也只是择取了一点,希望大家能够自己去主动学习指针内容。
思考五:
下面这段代码会输出什么呢,为什么?