string

头文件

#include <string>
using std::string;

初始化

#include <iostream>
#include <string>
using std::string;

using namespace std;

int main(){

    // 几种不同的声明和初始化方式
    string s1;
    string s2(s1);
    string s3("value");
    string s4(10, 'c');

    cout << "s1: " << s1 << endl;
    cout << "s2: " << s2 << endl;
    cout << "s3: " << s3 << endl;
    cout << "s4: " << s4 << endl;

    system("pause");
    return 0;
}

运行结果:

这里写图片描述

string对象的读写

int main(){

    // string对象的读与写
    string s,s1;

    cin >> s >> s1;
    cout << s << " , " << s1 << endl;

    system("pause");
    return 0;
}

string类型的输入操作符需要注意的时:

1)读取并忽略开头所有的空白字符(如空格、换行符、制表符等);
2)读取字符直至再次遇到空白字符,读取终止。

循环读入string对象

int main(){

    // string对象的读与写
    string word;
    cout << "input a word, Ctrl + Z to end !" << endl;

    // 遇到文件尾结束读取
    while (cin >> word){
        cout << word << endl;
    }

    system("pause");
    return 0;
}

注意:这个是读取到空白字符就会得到一个string对象。

使用getline按行读取文本

int main(){

    // string对象的读与写
    string word;
    cout << "input a word, Ctrl + Z to end !" << endl;

    // 遇到文件尾结束读取,每次输出一行文本
    while (getline(cin, word)){
        cout << word << endl;
    }

    system("pause");
    return 0;
}

注意:这个只要/有遇到换行符才会得到一个string对象,也就是说

1)这种方式string可以包含其他空白字符;
2)如果刚开始来就是换行就会得到一个空的字符;
3)getline函数返回时回丢弃换行符,换行符不会存储在string对象中。

size与empty操作

1、使用size()返回string长度

int main(){

    // size()返回string长度
    string word("The CQUer is hard-working");

    cout << "The size of " << word << " is " << word.size() << " characters!" << endl;

    system("pause");
    return 0;
}

结果:

The size of The CQUer is hard-working is 25 characters!

2、empty()判断字符是否为空,与判断size是否为0等效

int main(){

    // empty()判断字符是否为空
    string word;

    cout << (word.size() == 0) << endl;
    cout << word.empty() << endl;

    system("pause");
    return 0;
}

结果:

1
1

关于string::size_type

它是标准库中定义的配套类型,定义为与unsigned型(unsigned int或unsigned long)有相同含义,下面解释下为什么要使用这种类型而不用int型:

1)虽然不知道它的确切类型,但是可以知道他是unsigned型,其最大正数值比对应的signed型要大一倍,它可以保证足够大能够存储任意string对象的长度。

2)有些机器上int变量的表示范围太小,甚至无法存储实际并不长的string对象(16位int型机器上,int型最大能表示32767个字符,而容纳一个文件内容的string对象很轻易就回超过这个数字)。库类型的使用与机器无关,因此为了避免溢出,保存一个string对象size最安全的方法就是使用标准库类型string::size_type。

关系操作符

1、==,!=
判断两个字符串是否相等/不等。

2、<,<=,>,>=
string对象是大小写敏感的,关系操作符比较两个string对象时采用字典排序相同的策略:
1)两个string长度不同,且短的string与长的string前面部分时匹配的,则短的string小于长的string;
2)如果两个string对象字符不同,则比较第一个不匹配的字符

举例说明:

string substr="Hello";
string phrase="Hello World";
string slang ="Hiya";

根据字典序,有这样的关系:substr < phrase < slang 

赋值操作

string st1, st2 = "CQUer";
st1 = st2;

赋值操作会遇到一些效率问题,如下:

首先把st1 占用的相关内存释放掉,然后分配给st1足够存放st2副本的内存空间,最后把st2的所有字符复制到新分配的内存空间。

两个string相加

int main(){

    string s1("Hello ");
    string s2("World !");

    string s3 = s1 + s2;

    cout << s3 << endl;

    s1 += s2;

    cout << s1 << endl;

    system("pause");
    return 0;
}

结果:

Hello World !
Hello World !

和字符串字面值连接

和字符串字面值混合连接时,+操作符的左右操作数必须至少有一个时string类型的。

string s1("Hello ");
string s2("World !");

string s3 = s1 + ", " + s2 + "\n";

也就是,至少要有一个string对象参与相加,不能直接将两个字符串字面值相加起来

string s1("Hello ");
string s2("World !");

string s3 = s1 + ", " + s2 + "\n";
string s4 = "hello" + ","; // ×,不能直接两个字符串字面值相加
string s5 = s1 + "," + "world !"; // √,s1 + ","返回的是一个string对象可以继续往后面加
string s6 = "hello" + "," +s2; // ×,依此从左至右,前面两个字符串字面值相加了,不允许

string对象获取字符

可以用下标操作访问/操作string的某一个字符,下标的类型是size_type,如下用下标分别取出每一个字符。

int main(){

    string s("Hello ");

    for (string::size_type ix = 0; ix != s.size(); ix++)
        cout << "s[" << ix << "] = " << s[ix] << endl;

    system("pause");
    return 0;
}

结果:

s[0] = H
s[1] = e
s[2] = l
s[3] = l
s[4] = o
s[5] =

下标可用作左值

下标操作用作左值可以对string中某一位进行置位操作。

int main(){

    string s("Hello ");
    for (string::size_type ix = 0; ix != s.size(); ix++)
        cout << "s[" << ix << "] = " << s[ix] << endl;

    s[2] = 'm';

    cout << s << endl;

    system("pause");
    return 0;
}

结果:

s[0] = H
s[1] = e
s[2] = l
s[3] = l
s[4] = o
s[5] =
Hemlo

字符处理

string s("Hello ");

isalnum(s[0]); // 是否是字母或数字,是返回true
isalpha(s[0]); // 是否是字母
iscntrl(s[0]); // 是否为控制字符
isdigit(s[0]); // 是否为数字
isgraph(s[0]); // 如果不是空格,但可打印,则true
islower(s[0]); // 是否为小写字母
isprint(s[0]); // 是否为可打印字符
ispunct(s[0]); // 是否为标点符号
isspace(s[0]); // 是否为空白字符
isxdigit(s[0]); // 是否为十六进制数
tolower(s[0]); // 返回小写字母形式
toupper(s[0]); // 返回大写字母形式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值