C++014-C++字符串

简介: C++014-C++字符串

C++014-C++字符串



在线练习:

http://noi.openjudge.cn/

https://www.luogu.com.cn/


字符串


目标

1、了解字符串的基本概念

2、掌握字符串输入输出方法

3、掌握字符串复制、拼接、比较大小、求长度等方法


参考:https://www.cnblogs.com/zhaoyunt/p/15360127.html


char[]和string

先阐述C++中char[],string的区别和联系.


char[]

#include <iostream>
using namespace std;
int main()
{
    char a[10] = "123";
    a[4]='5';
    a[3]='4';
    cout << a;
    return 0;
}
// 输出:12345,此程序在a[5]的位置自动写入了'\0',终止符

95487e89b5996bceafc4bfbb43dd5438_bce64b82d5d94a18b9b40b17c13a4ae0.png


注意:这里的char [] 数组,

如果是全局变量,静态变量,一般编译器(具体要依赖于具体所使用的编译器和系统)会采用默认原则将内部的所有位置设置为0;

如果是局部变量,由于局部变量的内存分配是在栈上,如果未对char数组进行初始化的话,数组内的数据取决于此处原来的数据。同理,动态变量在堆上,同样数据为任意值。


char*

参考:https://blog.csdn.net/weixin_42322256/article/details/121450646

1、字符串char*


char *str1="abcde";  //这是一个字符串常量,存储在静态存储区,是只读的。
const char *str1 = "abcde";
char const *str1 = "abcde"; //注意,这两种写法等价
//其中,str1是一个变量,代表的意思就是字符串的第一个字符的值

案例


#include <iostream>
using namespace std;
int main()
{
  char arr[] = "abcdef";
  char* pc2 = arr;   //数组首元素地址赋值给指针pc2,指针大小只有4字节不可能放下整个数组
  cout << *pc2 << endl;   //输出是a,说明pc2存放的只是数组首元素地址
  cout << pc2 << endl;    //abcdef ,表示从pc2指向的地址位置开始打印
  cout << arr << endl;    //abcdef
    return 0;
}


输出为:

498dba4449139243eeda826356136cc3_5a20d20e20b64a1aa79db81ddcf15b6b.png


此处参照此博客:


关于字符串常量&字符数组&字符常量:https://blog.csdn.net/wuwuku123/article/details/103575620


const char * 、char const * 、 char * const 三者的区别:https://blog.csdn.net/qq_40244176/article/details/80765975


string

char是一个字符类型 C++的内置类型,char *是字符指针;

而string是一个字符容器,是一个扩展的模版类。

(一)、先解释char*字符串和string对象的区别。


1、定义


string:string是C++STL当中的一个容器,对其进行了封装,所以操作起来非常方便。

char*:char*是一个指针,可以指向一个字符串数组,至于这个数组可以在栈上分配,也可以在堆上分配,堆得话就要你手动释放了。


2、区别:


string的内存管理是由系统处理,除非系统内存池用完,不然不会出现这种内存问题。

char*的内存管理由用户自己处理,很容易出现内存不足的问题。

当我们要存一个串,但是不知道其他需要多少内存时,用string来处理就最好不过了。

当你知道了存储的内存的时候,可以用char*,但是不如用string的好,用指针总会有隐患。


用string还可以使用各种成员函数来处理串的每一个字符,方便处理。

用char*处理串,就不如string的方便了,没有相应的函数来直接调用,而是要自己编写函数来完成串的处理,而且处理过程中用指针还很容易出现内存问题。


3、注意:


当我们定义了一个string,就不能用scanf(“%s”,s)和printf(“%s”,s)输入输出。主要是因为%s要求后面是对象的首地址。


#include <iostream>
#include <string>
using namespace std;
int main(){
    string s1;//变量 s1 只是定义但没有初始化,编译器会将默认值赋给 s1,默认值是"",也即空字符串。
    string s2 = "c plus plus";//变量 s2 在定义的同时被初始化为"c plus plus"。与C风格的字符串不同,string 的结尾没有结束标志'\0'。
    string s3 = s2;//变量 s3 在定义的时候直接用 s2 进行初始化,因此 s3 的内容也是"c plus plus"。
    string s4 (5, 's');//变量 s4 被初始化为由 5 个's'字符组成的字符串,也就是"sssss"。
    return 0;
}

从上面的代码可以看出,string 变量可以直接通过赋值操作符=进行赋值。string 变量也可以用C风格的字符串进行赋值,例如,s2 是用一个字符串常量进行初始化的,而 s3 则是通过 s2 变量进行初始化的。


字符常量与字符串常量

ddb9028c328e87fd7e85211b8e9f336f_6a4d7a5ff0854a0fb78d98be3140987d.png


字符串的输入

1.cin>>字符串名;

string s1;//定义一个字符串变量s1
cin>>s1;//直接输入s1字符串

【注意】cin语句不会输入空格、换行符等分隔符(输入后,空格、换行符仍然留在输入缓冲区);


  1. getline(cin,字符串名);
string s1;
getline(cin,s1);//获取一行;


题目描述 字符串输出

【描述】

输入两个单词,用空格隔开,然后分两行分别输出这两个单词

【输入】

1行,两个单词,用空格分隔;

【输出】

2行,两个单词,每个单词一行;


#include <iostream>
#include <string>
using namespace std;
int main(){
    string s1,s2;
    cin>>s1>>s2;
    cout<<s1<<endl<<s2;
    return 0;
}

6bbd93fbdb53f7bfb1dd1b4bfc3e9474_e1e8d513d7f84f6aa049b335b3992ec9.png


题目描述-getline()的bug练习

【描述】

输入一个数字,这个数字可能是1也可能是2,然后分两行输入两个英文语句。如果是1就输出第一个句子,如果是2就输出第二个句子

【输入】

3行;第1行是一个数字;接下来的两行是2句英文句子。注意,句子中会存在空格,以换行符结束;

【输出】

1行,1个句子;

【样例输入】

1

l am a student.

My name is Hanmeimei.

【样例输出】

l am a student.


代码


#include <iostream>
#include <string>
using namespace std;
int main(){
    int n;
    string s1,s2;
    cin>>n;
    getline(cin,s1);
    getline(cin,s1);
    getline(cin,s2);
    if(n==1) cout<<s1;
    else cout<<s2;
    return 0;
}

8a21324b223ebbdfa1b7b7337d7bb9b8_b1e8fecc51f94e6da5dad3d17eb92ea5.png


求字符串的长度

字符串的长度即字符串内有效字符的个数。求字符串长度有两种方法

1:字符串名.size();——推荐

2∶字符串名.length();

功能:求字符串的长度


string s;
cin>>s;
int i=s.size();
cout<<i;

题目描述-求字符串的长度

【描述】输入一行字符串,输出它的长度是多少,字符可能存在空格哦。

【输入】1行字符串,串中会存在空格,以换行符结束;

【输出】1行,一个数字,代表字符串的长度

【样例输入】

i am zhang

【输出】

10


#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1;
    getline(cin,s1);
    int n=s1.size();
    //int n=s1.length();
    cout<<n<<endl;
  return 0;
}

05a5902674c0ee41ad7618f8d4cdb42f_f822a48b7c204944a1a5bf4f21a9c125.png


字符串内字符引用和遍历

字符串的数据部分类似于一个一维的char数组,如果字符串长度为L,从0号位置开始存储字符,最后一个字符的位置应该在L-1处,即s[L-1]。

string s=”iam”;那么s[0]='i;


题目描述-输出第一个大写字母

【描述】输入一个由大小写字符以及空格构成的字符串,输出其第1个大写字符。输入保证包含大写字符。

【输入】1行字符串,串中有若干空格;

【输出】1行,第一个大写字母;

【样例输入】

i am Zhang

【输出】

Z


#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1;
    getline(cin,s1);
    int n=s1.size();
    //int n=s1.length();
    for(int i=0;i<=n-1;i++)
    {
//        if(s1[i]>='A'&&s1[i]<='Z')
//        if(int(s1[i])>=65 && int(s1[i])<=90)
        if(s1[i]>=65 && s1[i]<=90)
        {
            cout<<s1[i];
            break;
        }
    }
  return 0;
}

5567f9e509b40a5e2d34dbe9c6f63b04_f2a5c00ee5d04afaa4751cc9ffdb4fec.png


字符串的复制与连接

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1,s2="Hello";
    s1=s2;
    cout<<"copy s2-->"<<s1<<endl;
    string s3=s1+s2;
    cout<<"s3=s1+s2-->"<<s3;
  return 0;
}

5d66d96b13d573c39478473a220a2ad3_ea86e7239dd641d28aa0399f15dc7ca4.png

字符串比较大小

两个字符串可以使用关系运算符进行比较大小,按照字典序从小到大比较。字符在ASCII码中的顺序和它的字典序是一致的。大写字符靠前,小写字符靠后。

比较规则如下:


空字符串小于其它所有字符串;

例如“abc”和“abcde”,则前者小于后者;

ha和 hang 比较, ha靠前,所以ha 比 hang 小;

ha和 aa 比较,aa靠前,所以ha 小。


比较方法


直接用>、<或==等关系运算符


题目描述-

【描述】输入两行字符串,比较他们的大小,让大的字符串放在前面,小的字符串放后面进行连接。如果两个字符串一样,随意连接。

【输入】2行字符串,串中会存在空格,以换行符结束;

【输出】1行,连接后的字符串

【样例输入】 you前有空行

you

good

【输出】

good you


#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1,s2,s3;
    getline(cin,s1);
    getline(cin,s2);
    if(s1>s2) s3=s1+s2;
    else s3=s2+s1;
    cout<<s3;
  return 0;
}

2b9b4fe871a7484cd3fcff6571fba52f_4b0b8ba2d4ea4d8da572706b890cce9a.png

题目描述-统计数字字符的个数

【描述】

输入一行字符,统计出其中数字字符的个数。

【输入】

一行字符串,总长度不超过255。

【输出】

输出为1行,输出字符串里面数字字符的个数。

【样例输入】

Peking University is set up at 1898.

【样例输出】

4


#include<iostream>
#include<string>
using namespace std;
int main()
{
    int sum=0;
    string s1;
    getline(cin,s1);
    int n=s1.size();
    for(int i=0;i<=n-1;i++)
    {
//        if(s1[i]>=48 && s1[i]<=57) sum++;
        if(s1[i]>='0' && s1[i]<='9') sum++;
    }
    cout<<sum;
  return 0;
}

ab37ce89113e19c907571484812020af_62bb01484ee34058989a1290f4af8074.png


题目描述-输出亲朋字符串

【描述】

编写程序,求给定字符串s的亲朋字符串s1。

亲朋字符串s1定义如下:给定字符串s的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个亲朋字符; 给定字符串s的第二个字符的ASCII值加第三个字符的ASCII值,得到第二个亲朋字符;依此类推,直到给定字符串s的倒数第二个字符。亲朋字符串的最 后一个字符由给定字符串s的最后一个字符ASCII值加s的第一个字符的ASCII值。


【输入】

输入一行,一个长度大于等于2,小于等于100的字符串。字符串中每个字符的ASCII值不大于63。

【输出】

输出一行,为变换后的亲朋字符串。输入保证变换后的字符串只有一行。

【样例输入】

1234

【样例输出】

cege

b8239c1cea996d4170e5e8ed24a0daa2_10a451765d724efe9d9902fdb2fdab5d.png


#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    int n=s.size();
    char temp=s[0]; //s[0]会被覆盖,先保存起来
    for(int i=0;i<=n-1;i++)
    {
        if(i<n-1) s[i]+=s[i+1];
        else s[i]+=temp;
    }
    cout<<s;
  return 0;
}

af77cec77493cac0a34741b4c149009f_b175b7d7fd5049a3b08e17892a31c62c.png


在线练习:


http://noi.openjudge.cn/

http://noi.openjudge.cn/ch0107/


总结


本系列为C++学习系列,会介绍C++基础语法,基础算法与数据结构的相关内容。本文为C++字符串案例,包括相关案例练习。



相关文章
|
2月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
80 4
|
1月前
|
缓存 网络协议 API
C/C++ StringToAddress(字符串转 boost::asio::ip::address)
通过上述步骤和示例代码,你可以轻松地在C++项目中实现从字符串到 `boost::asio::ip::address`的转换,从而充分利用Boost.Asio库进行网络编程。
52 0
|
1月前
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
|
2月前
|
C++
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
|
2月前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
4月前
|
算法 C++
2730. 找到最长的半重复子字符串(c++,滑动窗口)
2730. 找到最长的半重复子字符串(c++,滑动窗口)
|
4月前
|
C++
567. 字符串的排列(c++)滑动窗口
567. 字符串的排列(c++)滑动窗口
|
4月前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
5月前
|
C++ 容器
C++字符串string容器(构造、赋值、拼接、查找、替换、比较、存取、插入、删除、子串)
C++字符串string容器(构造、赋值、拼接、查找、替换、比较、存取、插入、删除、子串)
|
5月前
|
编译器 C++
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
38 1