由C语言的字符数组 到C++的string类——字符串用法总结

由C语言的字符数组 到C++的string类——字符串用法总结,笔者查看了网络上很多用法,都写的很混乱,就把自己对字符串用法的一点想法与思考简单的写下来,以求能够帮助到新入门的程序猿。

目录

1、字符数组

2、字符数组常用函数

1、gets函数——输入

2、puts函数——输出

3、strlen函数——求字符串长度

4、strcmp函数——比较两个字符串,str1比str2大则返回正数

5、strcpy函数——把右边赋值给左边

6、strcat函数——字符串连接函数

7、strlwr函数——转换为小写的函数

8、strupr函数——转换为大写的函数

3、string 字符串

一. 插入字符串insert()

二. 删除字符串

三. 字符串查找

四.字符串长度

五. 提取子字符串

4、string 字符串数组 

5、转换为C风格的字符串


1、字符数组

c语言是采用字符数数组的方式来存储字符串,比较简陋

c语言用法主要有:

#include
#include
using namespace std;
int main()
{   //输入单个字符
	char c = getchar();//常用来吞掉\n 
	printf("%c\n",c);
	//字符数组定义
	char str1[100];
	//输入字符串(输入空格和换行都会结束,不能输入空格)
	scanf("%s", &str1);//会自动帮你加上字符'\0'结束
	//输出字符串
	printf("%s\n", str1);
	//字符串长度
	int len1 = strlen(str1);//头文件string.h
	//遍历输出
	printf("遍历字符串str1\n");
	for (int i = 0; i < len1; i++)
	{
		printf("%c ", str1[i]);
	}
    //直接输出
    puts(str1);
	return 0;
}

如果需要输入空格可用gets()或者fgets();

这里用的IDE是vs2017 ,就用的gets_s();

#include
#include
using namespace std;
int main()
{
	char str[100];
	//输入空格
	gets_s(str);
	//输出
	printf("\n%s\n", str);
	return 0;
}

2、字符数组常用函数

1、gets函数——输入

gets()   现已改为gets_s(str);

2、puts函数——输出

puts(str);

3、strlen函数——求字符串长度

strlen(str);

4、strcmp函数——比较两个字符串,str1比str2大则返回正数

strcmp(str1,str2);

5、strcpy函数——把右边赋值给左边

strcpy(str1,"zhang san");

//补充一个内存拷贝函数

memcpy(d, s+11, sizeof(s));// 从第 11 个字符开始复制,连续复制 sizeof(s) 个字符

strcpy和memcpy主要有以下3方面的区别。

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。

6、strcat函数——字符串连接函数

  一般的形式:strcat(字符数组1,字符数组2);

  作用:把两个字符串数组中字符串连接起来,把字符串2连接到字符串1的后面。

  说明:字符数组1必须足够大,以便容纳连接后的新字符串。

7、strlwr函数——转换为小写的函数

  一般形式:strlwr(字符串);

8、strupr函数——转换为大写的函数

  一般形式:strupr(字符串)。

3、string 字符串

c++则采用string类来存储字符串,里面封装着许多实用的函数,

用法主要有:

#include
#include
using namespace std;
int main()
{
	//实例化
	string str = "zhang";
	//字符输入
	cin >> str;//同样与scanf()一样不会输入空格  自动加上'\0'
	//使用cin和cout要加入string头文件 不然会报错 在某站的C++老师学到的,估计一辈子都忘不了了
	//输出
	cout << str << endl;
	unsigned int i;//定义非负数i
	//长度 长度的话 有两个 经过研究 好像都是一模一样的 length()更加贴合c
	unsigned int len = str.length();
	unsigned int len2 = str.size();
	//遍历输出
	for (i = 0; i < len; i++)
	{
		cout << str[i] << " ";
	}
	return 0;
}

如果需要输入空格,有很多种方式,笔者认为使用getline(cin,string);比较方便

#include
#include
using namespace std;
int main()
{
	string s;
	getline(cin, s);//输入一行 第一个参数是输入方式,第二个是字符串
	cout << s;
	return 0;
}

string类还有其他实用的函数

s1.find(s2);

s1.npos;

s1.erase(s1.find(s2), s2.length());

以删除子串为例

/*
输入一个字符串S1,字符子串S2,在字符串删除含有字符串S2的子串,
输出删除子串的个数num以及最后剩下的字符串S3。
例如:
输入:S1:ababababac S2:aba
输出:num=2;S3=bbac
*/
#include
using namespace std;
int main()
{
	string s1, s2, s3;//s1是子串
	cout << "母串" << endl;
	getline(cin, s1);
	cout << "子串" << endl;
	getline(cin, s2);
    int i, j;
	int count = 0;//s.find()函数在找不到指定值得情况下会返回string::npos()
	//string 类将 npos 定义为保证大于任何有效下标的值。
	while (s1.find(s2) != s1.npos)//当查找成功时
	{
		count++;//删除子串的个数进行自增
		s1.erase(s1.find(s2), s2.length());//擦除s1中从x下标到x+s2.length()下标的字符
	}
	cout << "count=" << count << endl;
	cout << "删除后的:" << s1;
	return 0;
}

一. 插入字符串insert()

insert() 函数可以在 string 字符串中指定的位置插入另一个字符串,它的一种原型为:

string& insert (size_t pos, const string& str);

pos 表示要插入的位置,也就是下标;str 表示要插入的字符串,它可以是 string 字符串,也可以是C风格的字符串。

 s2.insert(5, "aaa");

二. 删除字符串

erase() 函数可以删除 string 中的一个子字符串

string& erase (size_t pos = 0, size_t len = npos);

pos 表示要删除的子字符串的起始下标,len 表示要删除子字符串的长度

三. 字符串查找

s.find(s1);

四.字符串长度

s.szie()和s.length()

五. 提取子字符串

ubstr() 函数用于从 string 字符串中提取子字符串,它的原型为:

string substr (size_t pos = 0, size_t len = npos) const;

pos 为要提取的子字符串的起始下标,len 为要提取的子字符串的长度。

4、string 字符串数组 

string str[100]={"zhangsan","lisi","wangwu"};
cout<

5、转换为C风格的字符串

虽然 C++ 提供了 string 类来替代C语言中的字符串,但是在实际编程中,有时候必须要使用C风格的字符串(例如打开文件时的路径),为此,string 类为我们提供了一个转换函数 c_str(),该函数能够将 string 字符串转换为C风格的字符串,并返回该字符串的 const 指针(const char*)。请看下面的代码:

string path = "D:\\demo.txt";

FILE *fp = fopen(path.c_str(), "rt");

未完待续 

你可能感兴趣的:(c语言和C++的故事,c语言,c++,开发语言)