本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。
转载声明出处
字符串初始化方式
方式 | 作用 |
---|---|
string s1 | 默认初始化,s1是空串,不建议这样做,手动赋空值更好 |
string s2(s1) | s2是s1的副本 |
string s2=s1 | 等价于s2(s1) |
string s3(“value”) | s3是字面值value的副本,除最后那个空字符 |
string s3=“value” | 等价于 s3(“value”) |
string s4(n,’c’) | 把s4初始化为连续n个字符c组成的串 |
string操作
os<<s //将s写到输出流os当中,返回os
is>>s //从is中取字符串赋值给s,字符串以空白分隔,返回is
getline(is,s) //从is中读取一行赋值给s,返回is
s.empty() //s为空返回true ,否则返回false
s.size() // 返回s中的字符个数
s[n] //返回s中第n个字符的引用,位置n从0开始计起
s1+s2 //返回s1和s2连接后的结果
s1 =s2 //用s2的副本 代替原来s1中的字符串
s1 ==s2 //如果s1 和s2中所含的字符完全一样,则他们相等返回true,否则不相等 返回false 对大小写敏感
s1!=s2 // //如果s1 和s2中所含的字符不一样,则返回true,否则 返回false 对大小写敏感
<,<=,>,>= 利用字符在字典中的顺序进行比较,且对大小写敏感
在使用getline读取字符串的时候要注意,触发getline函数返回的那个换行符实际上被丢弃,得到的对象中并不包括该字符
size函数返回的是size_type类型,实质上是无符号整型但因要体现和机器无关的特性,定义了size_type。在使用size的时候不要和int混淆 以免计算结果不是想要的
字面值 不是与string 不是一个类型
cctype头文件中函数 要知道能改变某个字符的特征。
方式 | 作用 |
---|---|
isalnum(c) | 当c是字母或数字时为真 |
isalpha(c) | 当c是字母时为真 |
iscntrl(c) | 当c是控制字符时为真 |
isdigit(c) | 当c是数字时为真 |
isgraph(c) | 当c不是空格但可以打印时为真 |
islower(c) | 当c是小写字母时为真 |
isprint(c) | 当c是可打印时为真 |
ispunct(c) | 当c是标点符号时为真 |
isspace(c) | 当c是不可打印时为真 |
isupper(c) | 当c是大写字母时为真 |
isxdigit(c) | 当c是十六进制数字时为真 |
tolower(c) | 当c是大写字母,输出对应的小写字母,否则原样输出 |
toupper(c) | 当c是小写字母,输出对应的大写字母,否则原样输出 |
练习 3.2 编写一段程序从标准输入中读入一整行,然后修改程序使其一次读入一个词。
#include <iostream>
#include <string>
int main()
{
std::string s[5] = {""}; //定义5个空的字符串
//一次读入一行 读入5行
for (int i = 0; i < 5; i++)
getline(std::cin, s[i]);//写入到字符串中
// 一次读入一个单纯 共五个单词
// for (int i = 0; i < 5;i++)
// std::cin>>s[i];//写入到字符串中
//输出
for (int i = 0; i < 5; i++)
std::cout << s[i] << std::endl;
system("pause");
return 0;
}
练习 3.3 请说明string类的输入运算符和getline函数分别如何处理空白字符的,
输入运算符 遇到空白字符结束输入
getline 遇到空白字符照常写入数据,知道遇到换行字符
练习 3.4 编写一段程序 读入两个字符串,比较是否相等并输出结果,如果不相等,输出较大的那个,改写上述程序,比较两个字符串长度是否相等,如果不等,输出长度大的那个字符串.
#include <iostream>
#include <string>
int main()
{
std::string s[2] = {""}; //声明两个字符串并赋值
for (int i = 0; i < 2; i++)
getline(std::cin, s[i]);//写入到字符串中
//判断两个字符串是否相等
if (s[0] == s[1])
{
std::cout << "两个字符串是相等的,他们都为" << s[0] << std::endl;
}
else
{
//使用三目运算符 得到大的那个字符串
//std::string sl = s[0]>s[1] ? s[0] : s[1];
std::cout << "他们不相等,大那个字符串是" << (s[0] > s[1] ? s[0] : s[1]) << std::endl;
}
//判断长度是否相等
if (s[0].size() == s[1].size())
{
std::cout << "两个字符串长度一样,他们长度都为" << (s[0].size()) << std::endl;
}
else
{
//使用三目运算符输出长的那个
std::cout << "两个字符串长度不一样,他们中长的那个字符串为" << (s[0].size() > s[1].size() ? s[0] : s[1]) << std::endl;
}
system("pause");
return 0;
}
输出结果如下
练习 3.5 编写一段程序从标准输入中读入多个字符串并将他们连接在一起,输出连接成的大字符串,然后修改上述程序,用空格把输入的多个字符串分隔开来。
#include <iostream>
#include <string>
int main()
{
std::string s = "";
std::string s1 = "";
std::string s2 = "";
while (getline(std::cin,s))
{
s1 = s1 + s;
s2 = s2 + " " + s;
}
std::cout << "连接一起的字符串为" << s1 << std::endl;
std::cout << "连接一起并加空格的字符串为" << s2 << std::endl;
system("pause");
return 0;
}
遍历字符串for(auto c:str) c为每个字符。
练习3.6:编写一段程序,使用范围for语句将字符串内的所有字符用X代替
#include <iostream>
#include <string>
#include <cctype>
int main()
{
std::string s = "";
std::string s1 = "";
while (getline(std::cin, s1))
{
s += s1;
s += '\n';
}
for (auto &c:s)
{
if (isalnum(c))
c = 'X';
}
std::cout <<s<< std::endl;
system("pause");
return 0;
}
练习3.7 就上一题完成的程序而言,如果将循环控制变量的类型设为char将发生什么?先估算一下结果,然后实际编程进行验证。
没有关系 因为auto推到出来控制便利的类型就为char
#include <iostream>
#include <string>
#include <cctype>
int main()
{
std::string s = "";
std::string s1 = "";
while (getline(std::cin, s1))
{
s += s1;
s += '\n';
}
for (char &c:s)
{
if (isalnum(c))
c = 'X';
}
std::cout <<s<< std::endl;
system("pause");
return 0;
}
练习 3.8 分半用while循环和传统for循环重写第一题的程序,你觉得那种形式更好
#include <iostream>
#include <string>
#include <cctype>
int main()
{
std::string s = "";
std::string s1 = "";
while (getline(std::cin, s1))
{
s += s1;
s += '\n';
}
for (auto &c : s)
{
if (isalnum(c))
c = 'X';
}
//注意i变量的类型 尽量不要使用int 可以使用size_type 或 无符号整型
decltype(s.size()) i = 0;
//传统for
for (i; i < s.size();i++)
{
if (isalnum(s[i]))
s[i] = 'X';
}
//while循环
while (i<s.size())
{
if (isalnum(s[i]))
s[i] = 'X';
++i;
}
std::cout << s << std::endl;
system("pause");
return 0;
}
练习3.9 下面程序有何作用,它合法吗?如果不合法,为什么
string s;
count<<s[0]<<endl;
没定义,不合法,在vs下能正常运行但是不合法,要定义赋初值。养好习惯
练习3.10 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分。
#include <iostream>
#include <string>
#include <cctype>
int main()
{
std::string s = "";
std::string s2 = "";
std::string s1 = "";
while (getline(std::cin, s2))
{
s += s2;
s += '\n';
}
for (auto &c : s)
{
if (!ispunct(c))
s1 += c;
}
std::cout << s1 << std::endl;
system("pause");
return 0;
}
练习3.11 下面的范围for语句合法吗,如果合法c的类型是什么
const string s =”Keep out!”;
for(auto &c:s) {}
c的类型 是const & ,在不修改c值的值情况下是合法的。
在上面程序中都把题目中要改写的方法 写在了一个函数中,取消相应注释就能得到。