c++ primer第五版(中文)习题答案 第三章第二节-标准库类型string

本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。
转载声明出处

字符串初始化方式

方式作用
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值的值情况下是合法的。

在上面程序中都把题目中要改写的方法 写在了一个函数中,取消相应注释就能得到。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值