内容包括但不限于:
1.#include<string>头文件(以及其中包含的常见处理函数)
2.字符串的多种赋值方式(1.指针2.数组3.string)
3.指针形式和数组形式的差别
4.指针与字符串(详见指针篇)
5.指针、数组、string表示字符串所占字节差别
6.连续输入一串字符串
简述c语言"字符串"
(1)c语言中没有字符串类型,只能用字符数组来存放字符串(可以std::string重载调用),其中'\0'作为结束标志。
(2)但是c语言中有字符串常量,如定义"HelloWorld"是个字符串常量。字符串常量占用一串连续的内存空间,没有名字但是有地址。
(3)'\0'是转义字符,称为“空值”,ASCII值为0,它占用存储空间,但不计入字符串总长度。
#include<string>头文件
(此处讲的是c++中的头文件,c语言中为<string.h>)
C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针。
c++<string>常用成员方法:
1)求字符串长度 :str.length();
2)字符串拼接
string s1 = "";
string s2 = "";
s2 = s2 + s1;
3)插入字符串:str.insert(pos, new_str);
pos
表示原字符串 str
中要插入的位置,即下标(位置要小心越界)new_str
表示要插入的字符串,可以是 string
字符串,也可以是C风格的字符串
4)删除字符串:str.erase(pos=0, len);
pos
表示字符串 str
中要删除的起始位置,即下标(默认为0)len
表示要删除的字符串长度,如果不设置 len
,则默认删至结尾
5)提取字符串:str.substr(pos=0, len);
pos
表示要从老字符串 str
中提取的起始位置,即下标(默认为0)len
表示新字符串的长度
6)查找字符串:str1.find(str2, pos);
用于在 str1
字符串中查找 str2
字符串出现的位置
pos
表示开始查找的位置,即起始下标,默认为0
返回值为下标(类型是 int
)
str1.rfind(str2, pos);
pos
表示从 str1
的起点开始查找,直到 pos
下标结束
返回值为下标(类型是 int
)
c语言<string.h>常用成员方法:
1)strlen求字符串长度:
int len1 = strlen(str1);
注意:strlen 的返回值是一个 size_t 类型,即无符号整数。 它的意义在于求长度时是不可能求出负数的,所以一定程度上优化了内存(使用有符号整形的话会浪费掉用来存储负数的空间)。
2)strcopy字符串拷贝
copy(str1,str2);
拷贝 str2指针指向的字符串至 str1指针指向的数组当中,拷贝的内容包含字符串终止符
注意:拷贝过去的内容是包含 '\0' 的。也就是说即使我拷贝过去的字符串长度没有数组原来的字符串长度长,但是我包含 '\0' 了,在 C 语言的角度来说 '\0' 之后的内容就不算从头往后看的字符串内容了。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20] = "row your boat";
char str2[] = "hello world";
strcpy(str1, str2);
printf("%s\n", str1);
return 0;
}
3)strncopy
strncpy 与 strcpy 的区别就是 strncpy 多了一个参数。这个参数是一个无符号的整数,即可以自定义拷贝多少个字节的内容。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[50] = "row row row your boat,";
char* str2 = "gently down the stream";
strcat(str1, str2);
printf("%s\n", str1);
return 0;
}
4)strcmp字符串的比较
#include <stdio.h>
#include <string.h>
int main()
{
char* str1 = "abbbcd";
char* str2 = "abbbdd";
int ret = strcmp(str1, str2);
if (ret > 0)
printf("str1 > str2\n");
else if (ret < 0)
printf("str1 < str2\n");
else
printf("str1 == str2\n");
return 0;
}
5)strncmp
strncmp 只是相较于 strcmp 多了一个参数,这个参数是一个无符号整数,代表的是字节。
#include <stdio.h>
#include <string.h>
int main()
{
char* str1 = "abbbcd";
char* str2 = "abbbdd";
int ret=strncmp(str1, str2,3);//我们只想比较字符串的前三个字节
if (ret > 0)
printf("str1 > str2\n");
else if (ret < 0)
printf("str1 < str2\n");
else
printf("str1 == str2\n");
return 0;
}
6)strcat字符串追加
将 str2 指针指向的字符串追加到 str1 指针指向数组并且有足够大的空间,其追加的位置是 destination 指针指向的字符串的 '\0' 处,即从这个位置拷贝。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[50] = "row row row your boat,";
char* str2 = "gently down the stream";
strcat(str1, str2);
printf("%s\n", str1);
return 0;
}
7)strncat
strncat 其参数多了一个无符号整形的参数,其意义代表字节数。即我们可以自定义想要追加多少个字符至另一个字符串的后面。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[50] = "row row row your boat,";
char str2[] = "gently down the stream";
strncat(str1, str2, 6);//我们只想追加 6 个字节的字符到 str1 中
printf("%s\n", str1);
return 0;
}
8)strstr字符串查找
#include <stdio.h>
#include <string.h>
int main()
{
char* str1 = "row row row your boat,gently down the stream";
char* str2 = "row your boat";
char* ret = strstr(str1, str2);//在 str1 中查找 str2
printf("%s\n", ret);
return 0;
}
字符串的多种赋值方式
//1.指针
char* a="abc";
//char *a={"abc"};
//char str[]="abc",*a=str;
//2.数组
char b[]="abc";
char name2[4]={'a','b','c','\0'};
//char name[4]={"abc"};
//char name="abc";这两种系统自动在末尾输入\0
//char name2="abc";报错 name2是char数组,abc是字符串
//3.字符串(c++中用法)
std::string name="hello";
//string有一个构造函数,接受char*或const char*参数
char name2[4]={'a','b','c','\0'};//这种形式必须加上'\0'才认为是一个字符串,否则是一个普通字符数组
字符数组作为字符串和指针指向字符串区别
mark中字符内容可以改变,mark却不能改变(是一个地址常量);
pmark本身可以加减,也可以指向其他常量,但是原来的字符串就无法使用了
指针、数组、string表示字符串所占字节差别
char* a="abc";
char name="abc";
char name2="abc";报错 name2是char数组,abc是字符串
std::string name="hello";
printf("sizeof(a)=%d\n",sizeof(a));
//占一个指针的字节,64位操作系统,,一个字节8位,8bit
printf("sizeof(name2)=%d\n",sizeof(name2));
//占整个数组的字节,数组大小决定 单指abc占用4字节(\0结尾)
printf("string:%d\n",sizeof(std::string));
//与系统有关,mac系统中所占字节24
printf("sizeof(name)=%d\n",sizeof(name));
//string仅有一个数据成员char*指针,所以和指针形式类似 与string所占字节相同
sizeof(a)=8
sizeof(name2)=4
string:24
sizeof(name)=24
连续输入一串字符串
//方法1:
#include<iostream>
int main()
{
char str1[10] = { 0 };
int i = 0;
while ((str1[i] = getchar()) != '\n') {
++i;
}
str1[i] = '\0';
printf("%s", str1);
return 0;
}
//方法二
#include<iostream>
int main()
{
char str[15] = { 0 };
gets(str);
printf("%s", str);
return 0;
}