上次在C++基础(12):字符类型中,介绍了使用字符数组来存储字符串,按照数组进行赋值,本次的字符串类型是指将字符串看作一个整体,进行输入和输出操作;但这样会相应的出现许多问题,比如,数组长度不能变化,不能直接复制,有数组越界的风险,C++提供了一些更好的工具,使用string数据类型来处理字符串。

字符串的输入

1、使用scanf()

语句:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    char s[100];
    scanf("%s", s);
    printf("%s", s);
    return 0;
}

注意:

1、scanf()语句中,字符串变量名“s”前,不加取地址符“&”。因为“s”是字符数组名,在C语言中,在C语言中数组名就代表该数组的起始地址;

2、系统会自动在输入的字符串常量后,自动添加'\0’标志,因此输入时,仅输入字符串的内容即可。

3、输入多个字符串时,字符串之间以空格分隔。

2、使用cin

1
2
3
4
5
6
7
8
9
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    char s[100];
    cin >> s;
    cout << s;
    return 0;
}

3、不再使用gets()函数

有一些老版本的书中,仍使用gets()函数读入字符串,这容易引起数组越界的问题,并且在C++11标准中已经将此函数删除了。

字符串的输出

与字符串输入相对应,输出可以使用printf()、cout、puts()向屏幕输出一个字符串。在上面程序中已有示例,不再赘述。

值得注意的是:puts语句输出一个字符串和一个换行符。对于已经声明过的字符串s, printf("%s\n" , a)和puts(a)是等价的。

使用string类型来处理字符串

使用string类型需要使用头文件string,有以下常用方法:

  1. string s :定义一个名字为s的字符串变量。
  2. s.size()或者s.length() :得到字符串s的长度。
  3. s +=str或者s.append(str) :在字符串s后面拼接字符串str。
  4. s < str :比较字符串s的字典序是否在字符串str的字典序之前。
  5. s.substr(pos,len) :截取字符串s,从pos个位置开始len个字符,并返回这个字符串。
  6. s.insert(pos,len) :在字符串s的第pos个字符之前,插入字符串str,并返回这个字符串。
  7. s.find(str,[pos]) :在字符串s中从第pos个字符开始寻找str,并返回位置,如果找不到返回-1。如果省略pos,则表示从头开始查找。

string类型还可以直接赋值常量,也可以互相赋值,但是,字符数组不能直接赋值。

1
2
3
string a, b;
a = "tubacode";
b = a;

string类型和字符数组还可以相互转换,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
//string 转字符数组
char arr[10];
string s = "tubacode";
int len = s.copy(arr, 9);//最多允许赋值9个字符,否则字符数组arr越界
arr[len] = '\0'; //末尾增加结束标记

//字符数组转string
char arr[10];
strcpy(arr, "tubacode");
string s;
s = arr;

头文件string和cstring的区别

cstring代表的是string.h,string.h是C++标准化(1998年)以前的C++库文件,在标准化过程中,为了兼容以前,标准化组织将所有这些文件都进行了新的定义,加入到了标准库中,加入后的文件名就新增了一个"c"前缀并且去掉了.h的后缀名,所以string.h头文件成了cstring头文件。但是其实现却是相同的或是兼容以前的。

string是真正的C++头文件,包含std::string的定义,属于STL范畴。之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,用== 进行比较,用+ 做串联(前面已经提到过)。我们可以把string看成是C++的基本数据类型。

cstring头文件不可以定义string s变量,string头文件可以定义string s变量。

现在,NOI的所有活动中,采用C++14标准,所以,在处理字符串时,建议使用string头文件,不建议使用cstring。

公众号:格致书院