概念:
用英文双引号括起来的任意的字符序列,这种固定的字符串可以叫做字符串常量
例如::”sdhjsdjdf/mmhyhsd./“
存储方式
字符数组
char a[] = "Black"; // 字符串默认以'\0'结尾,如:"Black\0",'\0'被隐藏起来了
//cout << sizeof(a) << endl;//计算字符数组的大小,此处为6
//if (a[5] == '\0')
// cout << "yes" << endl;//验证'\0'的存在
cout << a << endl;
char a[] = "Black"; // 字符串默认以'\0'结尾
//cout << sizeof(a) << endl;
//if (a[5] == '\0')
// cout << "yes" << endl;
cout << a << endl;
//字符串的输入
//先定好字符数组的长度
char a[100];
cin >> a; //cin遇到空格结束输入的字符串
// cout << a << endl;
if (a[5] == '\0') //从键盘上输入的字符串会自动加上'\0'
cout << "xxx" << endl;
字符串变量(限C++)
string,必须包含头文件
// string s = "Black";
// cout << s << endl;
string s;
cin >> s; //,这种输入方式,遇到空格结束输入空格之后的就不理会
cout << s << endl;
字符串的访问方式
下标访问
char a[] = "Black"
cout << a[0] <<endl;//输出'B'
string s = "Black";
string s = "Black";
cout << s[0] << endl;//输出'B'
cout << "Black"[0] << endl;//输出'B'
string s = "Black";
cout << s.at(0) << endl;//利用string类的一个函数来调用。输出'B'
对保存在string变量中字符串运算
加法运算
字符数组没有减法运算,用减法会报错,这里的加号是个运算符重载
string str1 = "abc", str2 = "xyz", str3;
str3 = str1 + str2;
cout << str3 << endl;//abcxyz
关系运算
比大小:从前往后按字符比较,第一个不相同字符的ASCII码值大的字符串大
string str1 = "aa", str2 = "aaa", str3="abc";
if (str1 < str2)
cout <<str2 << endl;
if (str2 < str3)
cout << str3 << endl;
对保存在string变量中的字符串常用的操作函数
size()/length()
计算字符串长度
string str = "0123456";
cout << "str.length()=" << str.length() << endl; //结果为7
cout << "str.size()=" << str.size() << endl; //结果为7
append()
追加
string s = "Black";
string s1 = " very";
s.append(" is").append(s1).append(" shuai");
cout << s << endl;
getline(cin,s)
getline()不会忽略space、tab,遇到Enter就结束,如果这个函数在一个一致循环的语句中,想退出用ctrl+z
string s;
getline(cin, s);
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
char src[] = "i am a good student";
char des[100];
// strcpy(dest, src);
strcpy(dest, "xxxxxxxx");
cout << dest << endl;
strcat(dest,src)
拼接字符串,形参列表里把前者与后者拼接一起
char dest[100] = "i";
char src[] = " am very good";
// strcat(dest, src);
strcat(dest, "xxxxxxx");
cout << dest << endl;
strcmp(字符数组名1,字符数组名2)
比较两个字符串是否一致,一致返回0
char a[] = "aaa";
char b[] = "aaa";
//int c = strcmp(a, b);
int c = strcmp("ccc", "ccc");
cout << c << endl;
strlen(字符数组名)
计算字符数组的长度
char a[] = "abc";
int len = strlen(a);
cout << len << endl;//3
strlwr(字符数组名)
strupr(字符数组名)
将字符串中小写字母转换成大写字母
char a[] = "abcDeFg";
// strlwr(a); //大写转小写
strupr(a); //小写转大写
cout << a << endl;
strstr(str1,str2)
判断str2是否为str1的子串
如果是,则返回str1字符串从str2第一次出现的位置开始到str结尾的字符串
否则,返回NULL
char str1[] = "abcdefghijklmn";
char str2[] = "fgb";
if (strstr(str1, str2) == NULL)
cout << "xxx" << endl;
else
cout << strstr(str1, str2) << endl;
练习
练习1:输出星期几
输入一个1到7的数字,表示星期一到星期日:屏幕输出相应的英文:Mon. Tue. Wed. Thur. Fri. Sat. Sun.
样例输入:
3
样例输出:
Wed.
#include <iostream>
using namespace std;
int main()
{
string s[] = { "Mon","Tue","Wed","Thur","Fri","Sat","Sun" };
int n;
cin >> n;
cout << s[n - 1] << endl;
return 0;
}
练习2:除去空格
一个句子中有许多连续的空格,过滤掉多余的空格,只留下一个空格。
输入格式:
1行,一个字符串(长度不超过200),句子的头和尾都没有空格。
输出格式:
过滤之后的句子。
输入样例:
Hello world.this is c++ language.
输出样例:
Hello world.this is c++ language.
分析:
使用getline(cin,s)来读入整行字符串;
遍历并判定如果不是空格就拼接。
如果前一个不是空格就加上前一个的空格。
#include <iostream>
#include<string>
using namespace std;
int main()
{
string s1, s2;
getline(cin, s1);
for(int i = 0; i < s1.size(); i++)
{
if(s1[i] != ' ')//遇到空格就不往s2里加字符
{
s2 += s1[i];
}
else if(s1[i + 1] != ' ')//确保能留下一个空格
{
s2 += s1[i];
}
}
cout << s2 << endl;
return 0;
}
练习3:输出井号键之间的字符
输入1行由字母和字符 “#”组成的字符串,保证 “#”出现偶次。
从前向后看,每两个 “#”字符之间的字符串是要摘录的文字,
书写一个程序,将摘录的字符串连续输出。
输入格式:
1行字符串,长度不超过1000000。
输出格式:
“#”号对应之间的字符。
输入样例:
aa#abcd#aaa#Aaa#bq.
输出样例:
abcdAaa
分析:
遍历字符串,
当元素!=‘#’ 时开始获取字符串直到下一个‘#’号。
拼接获取过的字符串。
提示:
两边都为‘#’时才截取。
如: b#aaa# 只截取aaa
#include <iostream>
#include<string>
using namespace std;
int main()
{
string s, ans;
cin >> s;
for(int i = 0; i < s.size(); i++)
{
if(s1[i] == '#')//找到第一个#
{
for(++i; s[i] != '#'; i++)找到第二个#才退出
ans += s[i];
}
}
cout << s2 << endl;
return 0;
}
练习4:字符串是否相等
字符串是否相等
判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等。
输入格式:
两行,每行包含一个字符串。
输出格式:
若两个字符串相等,输出YES,否则输出NO。
样例输入:
a A bb BB ccc CCC
Aa BBbb CCCccc
样例输出:
YES
#include <iostream>
#include<string>
using namespace std;
int main()
{
char s1[100], s2[200], a[100], b[100];
int l1 = 0;, l2 = 0;
gets_s(s1);//输入
gets_s(s2);
strlwr(s1);//大写改为小写
strlwr(s2);
for (int i = 0; i <= strlen(s1)//s1的长度; i++)
{
if (s1[i] != ' ')//去掉空格,遇到空格不往a[]里面输入
{
a[l1++] = s1[i];
}
}
for (int i = 0; i <= strlen(s2)//s2的长度; i++)
{
if (s2[i] != ' ')
{
b[l2++] = s2[i];
}
}
cout << a << endl;
cout << b << endl;
if (strcmp(a, b) == 0)//比较两组字符串,此函数如果两字符串数组一致会返回0
cout << "yes" << endl;
else
cout << "no" << endl;
return 0;
}