第七周(笔记)
7.1字符串的形式存储
- 字符串的三种形式
- 用双引号括起来的字符串常量,如"CHINA",“c++program”.
- 存放于字符数组中,以‘/0’字符结尾(ascill为0)
- 字符串常量
- 字符串常量占据内存的字节数等于字符串字符数目加1,多出来的结尾字符是‘/0’。
- 字符串的长度不包含‘/0’。
- ""也是合法的字符串常量,称为空串
- 如果字符串常量中包含双引号,则双引号应写为’ " ‘。而’ \ ‘字符在字符串中出现时,需连续写两次,变成’ \ '
- 用一维char数组存放字符串
- 包含’\0’ 字符的一维char数组,就是一个字符串。其中存放的字符串即为’\0’ 前面的字符组成
- 用char数组存放字符串,数组元素个数应该至少字符串长度+1
- char 数组的内容,可以在初始化时设定,也可以用c++库函数进行修改,还可以用对数组元素赋值的办法任意改变其中的某个字符。
- 字符数组同样可以用cout,printf输出,用cin,scanf读入。用cin、printf将字符串读入字符数组时,会自动在字符数组中字符串的末尾加上’\0’ 。
7.2 用scanf读入字符串
- 用scanf可以将字符串读入字符数组
- scanf会自动添加结尾的’\0’,%s读入,不加取地址符
- scanf读入到空格为止
- 在数组长度不足的情况下,scanf可能导致数组越界,若输入"12345",空间只有5则越界,因为字符串末尾还有个’\0’.
- 读入一行到字符数组:cin.getline(char buf[],int bufsize);读入一行(行长度不超过bufsize-1)或bufsize-1个字符到buf,自动添加’\0’回车换行符不会写入buf,但是会从输入流中去掉
- **读入一整行,比cin快,使用gets(char buf[]);**自动添加’\0’,回车换行符不会写入buf,但是会从输入流中去掉。可能导致数组越界
7.3 字符串库函数
- 使用字符串库函数需要#include < cstring >
- 字符串函数都根据’\0’来判断字符串结尾
- 形参 char[] 类型,则实参可以是char数组或字符串常量
- 库函数
-
字符串拷贝:strcpy(char [] dest,cahr [] src); 拷贝src到dest -
字符串比较大小:int strcmp (char [] s1,char [] s2); s1 == s2返回0,s1>s2 返回值大于0,s1 < s2 返回值小于0. -
求字符串长度:int strlen(char [] s);不包含结尾’\0’ -
字符串拼接:strcat(char [] s1,char [] s2); s2拼接到s1后面 -
字符串转成大写:strupr(char []); -
字符串转成小写:strlwr(char []);
注意:
7.4 编写判断字串的函数
#include <iostream>
using namespace std;
int Strstr(char s1[], char s2[]) {
if (s2[0] == 0) return 0;
for (int i = 0; s1[i]; i++) {
int k = i, j = 0;
for (; s2[j]; j++, k++) {
if (s1[k] != s2[j]) break;
}
if (s2[j] == 0) return i;
}
return -1;
}
int main()
{
char s[] = "sdfsss";
char a[] = "df";
cout << Strstr(s,a);
return 0;
}
|