概念:
用英文双引号括起来的任意的字符序列,这种固定的字符串可以叫做字符串常量
例如::”sdhjsdjdf/mmhyhsd./“

存储方式

字符数组

  1. char a[] = "Black"; // 字符串默认以'\0'结尾,如:"Black\0",'\0'被隐藏起来了
  2. //cout << sizeof(a) << endl;//计算字符数组的大小,此处为6
  3. //if (a[5] == '\0')
  4. // cout << "yes" << endl;//验证'\0'的存在
  5. cout << a << endl;
  6. char a[] = "Black"; // 字符串默认以'\0'结尾
  7. //cout << sizeof(a) << endl;
  8. //if (a[5] == '\0')
  9. // cout << "yes" << endl;
  10. cout << a << endl;
  11. //字符串的输入
  12. //先定好字符数组的长度
  13. char a[100];
  14. cin >> a; //cin遇到空格结束输入的字符串
  15. // cout << a << endl;
  16. if (a[5] == '\0') //从键盘上输入的字符串会自动加上'\0'
  17. cout << "xxx" << endl;

字符串变量(限C++)

string,必须包含头文件,作为标准库的而一部分,定义在命名空间std中

  1. // string s = "Black";
  2. // cout << s << endl;
  3. string s;
  4. cin >> s; //,这种输入方式,遇到空格结束输入空格之后的就不理会
  5. cout << s << endl;

注意:如果输入的字符没有空格的话尽量用cin输入

字符串的访问方式

下标访问

  1. char a[] = "Black"
  2. cout << a[0] <<endl;//输出'B'
  3. string s = "Black";
  4. string s = "Black";
  5. cout << s[0] << endl;//输出'B'
  6. cout << "Black"[0] << endl;//输出'B'
  7. string s = "Black";
  8. cout << s.at(0) << endl;//利用string类的一个函数来调用。输出'B'

对保存在string变量中字符串运算

加法运算

字符数组没有减法运算,用减法会报错,这里的加号是个运算符重载

  1. string str1 = "abc", str2 = "xyz", str3;
  2. str3 = str1 + str2;
  3. cout << str3 << endl;//abcxyz

关系运算

比大小:从前往后按字符比较,第一个不相同字符的ASCII码值大的字符串大

  1. string str1 = "aa", str2 = "aaa", str3="abc";
  2. if (str1 < str2)
  3. cout <<str2 << endl;
  4. if (str2 < str3)
  5. cout << str3 << endl;

对保存在string变量中的字符串常用的操作函数

size()/length()

计算字符串长度

  1. string str = "0123456";
  2. cout << "str.length()=" << str.length() << endl; //结果为7
  3. cout << "str.size()=" << str.size() << endl; //结果为7

append()

追加

  1. string s = "Black";
  2. string s1 = " very";
  3. s.append(" is").append(s1).append(" shuai");
  4. cout << s << endl;

getline(cin,s)

getline()不会忽略space、tab,遇到Enter就结束,如果这个函数在一个一致循环的语句中,想退出用ctrl+z

  1. string s;
  2. getline(cin, s);
  3. cout << s << endl;

gets()为c语言老的用法,现在vs改为gets_s()
一些使用输入的用法

clear()

清空整个字符串

substr()

substr(pos,len)返回从pos位置开始,长度为len的字串

insert()

insert(pos,string),在pos位置插入字符串string

erase()

erase(pos,length),pos为要删除字符串的起始位置,length是长度

replace()

a.replace(pos,len,str2)表示把a从pos号位开始,长度为len的字符串替换成str2

strcpy(字符数组名1/dest,字符数组名2/src)

拷贝字符串,把src的字符串拷贝到dest

  1. char src[] = "i am a good student";
  2. char des[100];
  3. // strcpy(dest, src);
  4. strcpy(dest, "xxxxxxxx");
  5. cout << dest << endl;

strcat(dest,src)

拼接字符串,形参列表里把前者与后者拼接一起

  1. char dest[100] = "i";
  2. char src[] = " am very good";
  3. // strcat(dest, src);
  4. strcat(dest, "xxxxxxx");
  5. cout << dest << endl;

strcmp(字符数组名1,字符数组名2)

比较两个字符串是否一致,一致返回0

  1. char a[] = "aaa";
  2. char b[] = "aaa";
  3. //int c = strcmp(a, b);
  4. int c = strcmp("ccc", "ccc");
  5. cout << c << endl;

strlen(字符数组名)

计算字符数组的长度

  1. char a[] = "abc";
  2. int len = strlen(a);
  3. cout << len << endl;//3

strlwr(字符数组名)

将字符串中大写字母转换成小写字母

strupr(字符数组名)

将字符串中小写字母转换成大写字母

  1. char a[] = "abcDeFg";
  2. // strlwr(a); //大写转小写
  3. strupr(a); //小写转大写
  4. cout << a << endl;

strstr(str1,str2)

判断str2是否为str1的子串
如果是,则返回str1字符串从str2第一次出现的位置开始到str结尾的字符串
否则,返回NULL

  1. char str1[] = "abcdefghijklmn";
  2. char str2[] = "fgb";
  3. if (strstr(str1, str2) == NULL)
  4. cout << "xxx" << endl;
  5. else
  6. cout << strstr(str1, str2) << endl;

练习

练习1:输出星期几

输入一个1到7的数字,表示星期一到星期日:屏幕输出相应的英文:Mon. Tue. Wed. Thur. Fri. Sat. Sun.
样例输入:
3
样例输出:
Wed.

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. string s[] = { "Mon","Tue","Wed","Thur","Fri","Sat","Sun" };
  6. int n;
  7. cin >> n;
  8. cout << s[n - 1] << endl;
  9. return 0;
  10. }

练习2:除去空格

一个句子中有许多连续的空格,过滤掉多余的空格,只留下一个空格。
输入格式:
1行,一个字符串(长度不超过200),句子的头和尾都没有空格。
输出格式:
过滤之后的句子。

输入样例:
Hello world.this is c++ language.
输出样例:
Hello world.this is c++ language.
分析:
使用getline(cin,s)来读入整行字符串;
遍历并判定如果不是空格就拼接。
如果前一个不是空格就加上前一个的空格。

  1. #include <iostream>
  2. #include<string>
  3. using namespace std;
  4. int main()
  5. {
  6. string s1, s2;
  7. getline(cin, s1);
  8. for(int i = 0; i < s1.size(); i++)
  9. {
  10. if(s1[i] != ' ')//遇到空格就不往s2里加字符
  11. {
  12. s2 += s1[i];
  13. }
  14. else if(s1[i + 1] != ' ')//确保能留下一个空格
  15. {
  16. s2 += s1[i];
  17. }
  18. }
  19. cout << s2 << endl;
  20. return 0;
  21. }

练习3:输出井号键之间的字符

输入1行由字母和字符 “#”组成的字符串,保证 “#”出现偶次。
从前向后看,每两个 “#”字符之间的字符串是要摘录的文字,
书写一个程序,将摘录的字符串连续输出。
输入格式:
1行字符串,长度不超过1000000。
输出格式:
“#”号对应之间的字符。
输入样例:
aa#abcd#aaa#Aaa#bq.
输出样例:
abcdAaa
分析:
遍历字符串,
当元素!=‘#’ 时开始获取字符串直到下一个‘#’号。
拼接获取过的字符串。
提示:
两边都为‘#’时才截取。
如: b#aaa# 只截取aaa

  1. #include <iostream>
  2. #include<string>
  3. using namespace std;
  4. int main()
  5. {
  6. string s, ans;
  7. cin >> s;
  8. for(int i = 0; i < s.size(); i++)
  9. {
  10. if(s1[i] == '#')//找到第一个#
  11. {
  12. for(++i; s[i] != '#'; i++)找到第二个#才退出
  13. ans += s[i];
  14. }
  15. }
  16. cout << s2 << endl;
  17. return 0;
  18. }

练习4:字符串是否相等

字符串是否相等
判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等。

输入格式:
两行,每行包含一个字符串。
输出格式:
若两个字符串相等,输出YES,否则输出NO。

样例输入:
a A bb BB ccc CCC
Aa BBbb CCCccc
样例输出:
YES

  1. #include <iostream>
  2. #include<string>
  3. using namespace std;
  4. int main()
  5. {
  6. char s1[100], s2[200], a[100], b[100];
  7. int l1 = 0;, l2 = 0;
  8. gets_s(s1);//输入
  9. gets_s(s2);
  10. strlwr(s1);//大写改为小写
  11. strlwr(s2);
  12. for (int i = 0; i <= strlen(s1)//s1的长度; i++)
  13. {
  14. if (s1[i] != ' ')//去掉空格,遇到空格不往a[]里面输入
  15. {
  16. a[l1++] = s1[i];
  17. }
  18. }
  19. for (int i = 0; i <= strlen(s2)//s2的长度; i++)
  20. {
  21. if (s2[i] != ' ')
  22. {
  23. b[l2++] = s2[i];
  24. }
  25. }
  26. cout << a << endl;
  27. cout << b << endl;
  28. if (strcmp(a, b) == 0)//比较两组字符串,此函数如果两字符串数组一致会返回0
  29. cout << "yes" << endl;
  30. else
  31. cout << "no" << endl;
  32. return 0;
  33. }