1.字符串 输入和输出
其中
scanf("%s",string);
读入数据的时候是很微妙的
输入的是Hello world!
,输出结果是Hello#
。
scanf
函数只会读取一段单词(字母紧靠一起),遇到回车、空格或者tab就会停止。- 但是
scanf
函数的读入是不安全的,因为他不知道会读入多少长度的字符串。如果输入的字符串本身超过了数组的最大储存(别忘了0还会占用一个字节),(越界了)那么将会造成程序崩溃。 - 安全地读入
加一个限制,%7s 表示最多读入7个字符。当输入的字符超过7个的时候,他会自动截断;如果后面还会有读入的数组变量,那么他会将超出的字符部分直接读入下一个数组,交给下一个 %s 。
这里的
string
没有被初始化,没有让指针指向一个实际有效的地址!,作为本地变量,是没有初始值的,原来在哪里有什么就是什么。可能指针string
指到了一个不是0的地方。
“为什么在我的电脑上能跑,copy到他那就不行了呢”
2.字符串函数 #include<string.h>
- 2.1
返回数组s(这里数组作为函数中传入的参数,直接拿指针表示即可)中的字符串的长度,注意不包括结尾的0。
在计算 数组 长度的时候,算上0,因为0需要占据空间;在计算数组中的 字符串 的长度的时候,不算0。
- 2.2
可以比较出两个字符串谁大谁小或者相等。
- 比较数组长度的大小(注意不用带[ ])
printf("%d",strcmp(s1,s2);
- 可以和 if 语句连用
if(strcmp(s1,s2) == 0)
- 当使用等号直接比较两个数组的大小
if(s1 ==s2)
,返回值永远是false。因为两个不同的数组一定不是相同的地址。
当两个数组大小不相等的时候,其实返回值就是s1 - s2 ,即俩字符串内容的距离。
比较的时候是按照下标一个一个进行比较的:
s1[0] ?= s2[0]
;s1[1] ?= s2[1]
…
拷贝,把第二个src字符串copy到第一个参数dst表达的空间
连接,本身也是一种copy
对于安全问题的安全版本
在size_t n那里写数字,代表大小