C语言和C++字符串的区别

C语言

字符串初始化

char str[5] = { 'a','b','c','d','e' };

可以直接赋值,但当需要使用puts()输出时,需要加上’\0’,表示该字符串结束,'\0’占用一个字符位。

输入输出方式

有三种输入输出方式:scanf和printf,getchar()和putchar(),gets()和puts();

1.scanf输入,printf输出

对于字符类型有两种格式:%s和%c
%c:输入单个字符,能够识别空格和换行并将其输入。
%s:输入一串字符存在数组中,通过换行或空格来识别一个字符串的结束。

char str[5] = { 'a','b','c','d','e' };
for (int i = 0;i < 5;i++) {
	printf("%c", str[i]);
}
char str[5];
	scanf("%s",str);
	printf("%s", str);

2.getchar输入,putchar输出

char str[5][5];
	for (int i = 0;i < 3;i++) {
		for (int j = 0;j < 3;j++) {
			str[i][j] = getchar();
		}
	}
	for (int i = 0;i < 3;i++) {
		for (int j = 0;j < 3;j++) {
			putchar(str[i][j]);
		}
	}

3.gets输入,puts输出

char str[5];
	gets(str);
	puts(str);

如果要使用getchar输入,puts输出是,这需要手动在字符串输入完后加上’\0’,否则会乱码。

char str[5];
	int i;
	for (i = 0;i < 3;i++) {
			str[i] = getchar();
	}
	str[i] = '\0';
	puts(str);

string.h中的一些函数

1.strlen()

字符数组第一个’\0’前的字符个数

int len = strlen(str);

2.strcmp()

两个字符串比较大小

int cmp = strcmp(str1,str2)
if ( cmp < 0){
	printf("str1 < str2");
}else if(cmp > 0){
	printf("str1 > str2");
}else{
	printf("str1 = str2");
}

3.strcpy()

把一个字符串赋值给另一个字符串

//把str2复制给str1
strcpy(str1,str2);

4.strcat()

把一个字符串接到另一个字符串后面

把str2接到str1的后面
strcat(str1,str2);

C++

C++在STL中加入了string类型,#include

初始化和访问

string str1, str2="abcd";

一些简单操作,复制,衔接,比大小,算长度等
如果要读入或者输出整个字符串,只能用cin和count

void stringTest() {
	string str1, str2;
	cin>>str1;
	printf("str1的长度为:%d\n", str1.length());
	str2=str1;
	str2=str2+"Ilovecat";
	printf("str2的长度为:%d\n", str2.size());
	if (str1>str2) {
		cout<<str1<<'\n';
	}
	else if (str1 < str2) {
		cout << str2 <<'\n';
	}
	else {
		cout << str1 << '\n'<<str2<<endl;
	}
}

如果一定要使用printf输出,则用c_str()将string类型转为字符数组类型进行输出.

string str = "abcd";
	printf("%s\n", str.c_str());

访问方式

1.下标访问
string str = "abcd";
	for (int i = 0;i < str.length();i++) {
		printf("%c", str[i]);
	}
2.通过迭代器访问
string str = "abcd";
	for (string::iterator it=str.begin();it!= str.end();it++) {
		printf("%c", *it);
	}

一些常用函数

1.insert()

插入函数,时间复杂度O(N)
(1)insert(pos,string),在pos号位置插入字符串string
(2)insert(it,it2,it3),it为原字符串欲插入的位置,t2和t3为待插字符串的首尾迭代器,来表示串[t2,t3]将被插在it的位置上。

2.erase()

删除函数,时间复杂度O(N)
(1)删除单个元素,str.erase(it),it为需要删除的元素的迭代器。
(2)删除一个区间内的所有元素,str.erase(first,last),first为起始值,last为需要删除区间的末尾的下一个地址。str.erase(pos,length),pos为起始位置,length为删除个数。

3.clear()

清空string中的数据,时间复杂度为O(1)

4.substr()

截取字符串,substr(pos,len),返回从pos号位开始长度为len的子串(不过包括len号位置的值),时间复杂度为O(len)

5.string::npos

常数,本身值为-1,但是unsigned_int类型,实际上也可以认为是unsigned_int类型的最大值,用于作为find()失配时的返回值。

6.find()

str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置,如果不是则返回string::npos。
str.find(str2,pos),从str的pos号位置开始匹配str2,返回值与上同。
时间复杂度O(nm),n=str1.length(),m=str2.length()

7.replace()

替换函数,时间复杂度O(str.length)
str.replace(pos,len,str2),把str从pos号位开始、长度为len的子串替换成str2.
str.replace(it1,it2,str2),把str的迭代器[it1,it2]范围的子串替换为str2.

函数汇总的案例

void stringFuncTest() {
	string str = "abcdefg", str1="12345";
	//插入
	str.insert(3, "xyz");
	str.insert(str.begin() + 3, str1.begin(), str1.end());
	cout <<"插入后:"<< str << endl;
	cout << endl;
	//删除
	str.erase(str.begin() + 4);
	cout << "删除单个元素:"<<str << endl;
	str.erase(str.begin() + 5, str.end() - 6);
	cout << "删除多个元素:" << str << endl;
	str.erase( 3, 5);
	cout << "删除多个元素2:" << str << endl;
	cout << endl;
	//清空
	cout <<"str1的长度:"<< str1.length() << endl;
	str1.clear();
	cout << "clear后str1的长度:" << str1.length() << endl;
	cout << endl;
	//截取
	string str2 = "What are you?";
	cout << "str2:" << str2 << endl;
	cout<<"截取str2的子串:"<<str2.substr(0, 4)<<endl;
	cout << endl;
	//string::npos测试
	if (string::npos == 1) {
		cout << "-1 is true" << endl;
	}
	if (string::npos == 4294967295) {
		cout << "4294967295 is true" << endl;
	}
	cout << endl;
	//找子串
	string str3 = "are";
	string str4 = "is";
	if (str2.find(str3) != string::npos) {
		cout << str2.find(str3) << endl;
	}
	if (str2.find(str4) != string::npos) {
		cout << str2.find(str4) << endl;
	}
	else {
		cout << "No Find." << endl;
	}
	cout << endl;
	//替换
	cout << "替换str2的结果:" << str2.replace(5, 2, str4) << endl;
}

C语言和C++字符串的区别_第1张图片

你可能感兴趣的:(C++,c语言,c++)