字符串

字符与整数的联系——ASCII码:

  1. 每个常用字符都对应一个-128~127的数字,二者之间可以相互转化

  2. 常用ASCII值:’A’-‘Z’ 是65~90,’a’-‘z’是97-122,’0’-‘9’是48-57。

统计字符串中字符出现的次数:

思路:每个字符都对应一个整数值,将他们转成整数,记录到计数数组内,数组++即可(数组此时相当于一个变量)

   char str[100000+10];      	// 例子针对小写字母字符串 :’a’-‘z’是97-122
   int ant[26];					// str[i]-'a'  把字符a~z转为数字0~26
   int len = strlen(str);  
   
   for(int i=0; i<len; i++)
    {
        ant[str[i]-'a'] + +;	// ant[str[i]-'a']  相当于一个变量 (ant[0]++) ant[0]对应a的次数
    }
  1. 字符可以参与运算,运算时会将其当做整数

字符串定义形式1——字符数组:

1.  字符串就是字符数组加上结束符’\0’。
2.  可以使用字符串来初始化字符数组,但此时要注意,每个字符串结尾会暗含一个’\0’字符,因此字符数组的长度至少要比字符串的长度多1!
	char str[100];
	
	cin>>str;			// 输入字符串时遇到空格或者回车就会停止! 
	cout<<str<<endl;
	printf("%s\n",str);	// 输出字符串时遇到空格或者回车不会停止!
	puts(str);        	// 等价于printf("%s\n",str);


	cin >> str + 2;		// 从某个下标开始输入输出 
	scanf("%s", str + 2);
	cout <<str + 2 << endl; 
	printf("%s\n", str + 1);
  1. 若想输入输出含有空格的字符串(读入整行)

    方法一:c语言fegets(数组名,最大读入数,stdin)函数
    char str[100];
    fgets(str,10000,stdin);
    cout<<str;

    方法二:c++ sring类:getline()函数
    string str;
    getline(cin, str);
    cout << str;

  2. 字符数组常用操作:下面几个函数需要引入头文件:#include <string.h>

    (1) strlen(str),求字符串的长度

    (2) strcmp(a, b),比较两个字符串的大小,a < b 返回-1,a == b 返回0,a > b返回1。这里的比较方式是字典序!

    (3) strcpy(a, b),将字符串b复制给从a开始的字符数组。

注:这些函数的执行都会默认进行循环(遍历)------- 一般用一个变量来记录长度

// 遍历输出每一个字符
for(int i=0; i< strlen(s); i++)  相当于两重循环费时!
{
	cout<<s[i]<< " ";
 } 
 
//一般用一个变量来记录长度
int length = strlen(s);
for(int i=0; i< length; i++)
{
	cout<<s[i]<< " ";
 } 

字符串定义形式2——标准库类型 string,相比于c语言更加的方便简易

​ (1)string读写

	string str;
	cin>>str;			// 输入字符串时遇到空格或者回车就会停止! 
	cout<<str<<endl;

注意:不能用printf直接输出string,需要写成:printf(“%s”, s.c_str());

​ (2)使用getline读取一整行:

	string str;
	getline(cin, str);
	cout << str;

​ (3)string的empty 和size (返回数组长度)操作(注意size是无符号整数,因此 s.size() <= -1一定成立):

empty:判断字符串是否为空 bool 值

size:返回数组长度 与c语言的strlen功能一样,不同的是它直接得结果不用循环(O(1))

​ (4) string 的比较:支持 > < >= <= == !=等所有比较操作(直接比较),按字典序进行比较

​ (5) 为string对象赋值:

	string s1(10, ‘c’), s2;		// s1的内容是 cccccccccc;s2是一个空字符串

	s1 = s2;					// 赋值:用s2的副本替换s1的副本

								// 此时s1和s2都是空字符串

​ (6)两个string对象相加(支持累加):

   string s1 = “hello,  ”, s2 = “world\n”;
   string s3 = s1 + s2;					// s3的内容是 hello, world\n
   s1 += s2;								// s1 = s1 + s2

​ (7)字面值和string对象相加:

做加法运算时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来:

​ string s1 = “hello”, s2 = “world”; // 在s1和s2中都没有标点符号

​ string s3 = s1 + “, “ + s2 + ‘\n’;

当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string:

string s4 = s1 + “, “; // 正确:把一个string对象和有一个字面值相加

string s5 = “hello” +”, “; // 错误:两个运算对象都不是string

string s6 = s1 + “, “ + “world”; // 正确,每个加法运算都有一个运算符是string

string s7 = “hello” + “, “ + s2; // 错误:不能把字面值直接相加,运算是从左到右进行的

(8)可以将string对象当成字符数组来处理:

	string str = "hello !";
	//for(char c : str) 或者 for(auto c : str)  c相当于一个变量
	for(int i =0;i < str.size(); i++)
	{
		cout<<str[i]<< " ";
	}

如果想改变c来改变str(字符串本身) : &

	string str = "hello!";        
	for(auto c : str)	//auto:自己判断类型		
	{
		c= 'a';
	}
	cout<<str;  //hello!

	for(auto &c : str)  // 地址
	{	
        // 一些判断语句等
		c= 'a';
	}
	cout<<str;  //aaaaaa
posted @ 2021-08-10 14:29  时间最考验人  阅读(198)  评论(0编辑  收藏  举报