首页 > 编程语言 >c++ string 使用例子

c++ string 使用例子

时间:2024-05-29 11:25:14浏览次数:20  
标签:string temp c++ 例子 str 字符串 getline cout

 

 

===============

一文读懂C++ String类在算法竞赛中的常见用法

string 相较于C语言的字符数组可方便太多了,在算法竞赛中能大大节省我们的时间。以下是我在刷题中会使用到的常见String用法。注释都写好了。

#include <iostream>
#include <string>
using namespace std;
int main(){
    //1、字符串拼接
    string s1 = "Hello";
    string s2 = "World!";
    string s3 = s1 + s2;
    cout<< s3 <<endl; //输出为HelloWorld!
    s3.append("123"); //字符串自加
    cout<< s3 <<endl; //输出为HelloWorld!123

    //2、字符串输入输出
//    cin >> s3; //输入Hello World! cin是以空格,回车作为结束输入的标志
//    cout<< s3 <<endl; //输出为Hello

    //3、读取一行字符
//    getline(cin, s3); // 读取⼀⾏的字符串,包括空格 输入Hello World!
    cout<< s3 <<endl; //输出为Hello World!

    //4、获取字符串的长度
    int lens1 = s1.length();
    cout<< lens1 <<endl; //输出为5
    int lens2 = s2.size();
    cout<< lens2 <<endl; //输出为6


    //5、将字符串当成字符数组使用
    cout<<s1[0]<<endl; //输出为H
    cout<<s1[1]<<endl; //输出为e
    cout<<s1[2]<<endl; //输出为l

    //6、字符串与字符数组的互换
    //字符串转字符数组
    //方法1
    char a[100];
    int lens = s1.copy(a,s1.size());
    a[lens] = '\0';
    printf("%s\n",a); //输出Hello
    //方法2
    strcpy(a,s2.c_str());
    printf("%s\n",a); //输出World!

    //字符数组转字符串
    string s5(a);
    cout<<s5<<endl; //输出World!

    //7、字符串的比较
    s1 = "abc";
    s2 = "abb";
    if (s1 > s2) cout<<"yes1"<<endl; //输出yes1 按照字典序比大小
    s1 = "Abc";
    s2 = "abb";
    if (s1 > s2) cout<<"yes2"<<endl; //不输出,大小写敏感,且大写字母的值小于小写字母的值 按照字典序比大小

    s1 = "A";
    s2 = "a";
    if (s1 < s2) cout<<"yes3"<<endl; //输出yes3 大写字母的值小于小写字母的值

    //8、字符串的子串
    s1 = "hello World!";
    s2 = s1.substr(2,5);
    cout<<s2<<endl; //输出 llo W 从下标2开始 截取5个字符
    s2 = s1.substr(3);
    cout<<s2<<endl; //输出 llo W 从下标3开始 截取3到末尾的所有字符

    //9、查找字符串的子串
    int n = s1.find("World");
    cout<<n<<endl; //输出6 即从下标6开始就是这个匹配的字符
    cout<<s1.find("o")<<endl; //输出4 从前往后查找输出最先匹配到的下标
    cout<<s1.rfind("o")<<endl; //输出7 从后往前查找输出最先匹配到的下标
    cout<<s1.find("oo")<<endl; //输出18446744073709551615 额,反正就是没有找到

    //10、替换字符串
    s1 = "hello World!";
    s1.replace(0,5,"fuck");
    cout<<s1<<endl; //输出fuck World!
    //指定替换 例如将World! 中的orl 替换成ORL
    n = s1.find("orl");
    s1.replace(n,3,"ORL");
    cout<<s1<<endl; //输出fuck WORLd!

    //11、删除子串
    s1.erase(n,3); //n表示位置 3表示删除三个字符
    cout<<s1<<endl; //输出fuck Wd!

    //12、添加子串
    s1.insert(5,"aaa");//5表示位置 "aaa"表示增加的字符串
    cout<<s1<<endl; //输出fuck aaaWd!

    //13、STL 操作string
    string s("afgc1bed3");
    string::iterator p = find(s.begin(), s.end(), 'c');
    if (p!= s.end())
        cout << p - s.begin() << endl;  //输出3 相当于c的指针-头指针
    sort(s.begin(), s.end()); //字符串排序
    cout << s << endl;  //输出 13abcdefg
    //其余STL操作就不演示了,基本上都是支持的
    
    return 0;
}
  https://www.cnblogs.com/xwxz/p/14719027.html

============

中间无空格字符串接收


// 方法一
string s;
cin>>s;

// 方法二
string t;
t.resize(10); //必须设置大小
scanf("%s", t.c_str());  //输入 123aaa
cout<<t<<endl; //输出 123aaa 

中间带空格字符串接收

getline(cin, s);

getline()和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样两个函数

若getline(cin,str)前有cin<<a;那么影响geline,geline第一个读取到的将是cin输入a时缓存在缓存中的回车

int n;
string s;
cin>>n;
getchar();//吸收缓冲区中回车
while(n-->0){
    getline(cin,s); //接收整行测试数据,整行中可以有多个空格
}

注: PAT常见问题中有说明:某些库函数因为存在安全隐患是不能用的,目前主要常见的是itoa和gets。

字符串输出

// 方法一
string s="Hello World!";
printf("%s",s.c_str());
cout<<s<<endl;

// 方法二
char sc[13]="Hello World!";
printf("%s", sc);
cout<<sc<<endl;

拼接

字符串拼接数字

/*
	字符串拼接数字 
*/
string st = "aaa";

//error
//st.append(11); 	//error need string
//st.push_back(65); 	//success but 65='A'
//cout<<st<<endl;	//aaaA 
//st+=65;		//success but 65='A'
//cout<<st<<endl;	//aaaAA

// correct
st+=to_string(11);
cout<<st<<endl;
st.append(1,9+'0');//在结尾追加一个字符'9'
cout<<st<<endl;
st.push_back(char(7+'0'));//在结尾追加一个字符'7'

字符串拼接字符

/*
	字符串拼接字符 
*/
string str = "aaa";
str+='A';
cout<<str<<endl;//aaaA

str.push_back('B'); 
cout<<str<<endl;//aaaAB

//str.append('B'); //error 
str.append(3, 'C');
cout<<str<<endl;//aaaABCCC

字符串拼接字符串

/*
	字符串拼接字符串 
*/
string s = "aaa";
s.append("bbb");
cout<<s<<endl;//aaabbb

s+="ccc";
cout<<s<<endl;//aaabbbccc

//	s.push_back("ddd");//error, need char 

查找

查找子串

函数返回值函数名(参数列表)
string (1) size_t find (const string& str, size_t pos = 0) const noexcept;
c-string (2) size_t find (const char* s, size_t pos = 0) const;
buffer (3) size_t find (const char* s, size_t pos, size_type n) const;
character (4) size_t find (char c, size_t pos = 0) const noexcept;
#include <iostream>
using namespace std;
int main(int argc,char * argv[]) {
	string s = "There are two needles in this haystack with needles.";
	string s2 = "needle";
           
	size_t found = s.find(s2); //查找子串,返回首字符出现位置
	if (found!=string::npos)
		std::cout << "first 'needle' found at: " << found << '\n';

	found=s.find("needles are small",found+1,6); //参数说明:子串,原串其实匹配位置,需匹配的子串长度
	if (found!=string::npos)
		std::cout << "second 'needle' found at: " << found << '\n';

	found=s.find("haystack"); //查找子串,返回首字符出现位置
	if (found!=string::npos)
		std::cout << "'haystack' also found at: " << found << '\n';

	found=s.find('.'); //查找字符,返回首次出现位置
	if (found!=string::npos)
		std::cout << "Period found at: " << found << '\n';

	// let's replace the first needle:
	s.replace(s.find(s2),s2.length(),"preposition"); //替换第一个找到的s2所在位置,s2长度个字符
	std::cout << s << '\n';

	return 0;
}

子串擦除

// string::erase
#include <iostream>
#include <string>

int main ()
{
  std::string str ("This is an example sentence.");
  std::cout << str << '\n';
                                           // "This is an example sentence."
  str.erase (10,8);                        //            ^^^^^^^^
  std::cout << str << '\n';
                                           // "This is an sentence."
  str.erase (str.begin()+9);               //           ^
  std::cout << str << '\n';
                                           // "This is a sentence."
  str.erase (str.begin()+5, str.end()-9);  //       ^^^^^
  std::cout << str << '\n';
                                           // "This sentence."
  return 0;
}    

字符/字符串插入

// inserting into a string
#include <iostream>
#include <string>

int main ()
{
  std::string str="to be question";
  std::string str2="the ";
  std::string str3="or not to be";
  std::string::iterator it;

  // used in the same order as described above:
  str.insert(6,str2);                 // to be (the )question
  str.insert(6,str3,3,4);             // to be (not )the question
  str.insert(10,"that is cool",8);    // to be not (that is )the question
  str.insert(10,"to be ");            // to be not (to be )that is the question
  str.insert(15,1,':');               // to be not to be(:) that is the question
  it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
  str.insert (str.end(),3,'.');       // to be, not to be: that is the question(...)
  str.insert (it+2,str3.begin(),str3.begin()+3); // (or )

  std::cout << str << '\n';
  return 0;
}

数值型字符串转换为数值

将数字转换为字符串

  • to_string

将字符串转换为整数(a开头的函数,需要将string转换为char * , string.c_str())

  • atof(字符数组):将字符串转换为双精度浮点型值。
  • atoi(字符数组):将字符串转换为整型值。
  • atol(字符数组):将字符串转换为长整型值。
  • strtol(字符串,结束位置,进制):结束位置若为结尾则为NULL,进制默认0为十进制
  • stoi(字符串):将字符串转换为int
  • stof(字符串):将字符串转换为浮点数
  • stod(字符串):将字符串转换为双精度浮点数
cout<<"----------字符串与数字转换-------------"<<endl;

cout<<"----------字符串->>int整数转换-------------"<<endl;
//有效转换长度为10位
string si = "1234";
cout<<atoi(si.c_str())<<endl; //1234
cout<<stoi(si)<<endl;  //1234
cout<<stoi(si.c_str())<<endl; //1234

cout<<"----------字符串->>long整数转换-------------"<<endl;
string si0 = "2147483645";
cout<<strtol(si0.c_str(),NULL,0)<<endl; //2147483645
string sil = "214748364888";
cout<<strtol(sil.c_str(),NULL,0)<<endl; //2147483647 超过最大值后,按最大值输出

cout<<"----------字符串->>浮点数转换-------------"<<endl;
string sid = "1234.231235678";
cout<<atof(sid.c_str())<<endl; //1234
cout<<stof(sid)<<endl; //1234.23
cout<<stod(sid)<<endl;  //1234.23
cout<<stod(sid.c_str())<<endl; //1234

cout<<"----------浮点数->>字符串转换-------------"<<endl;
double d = 1234.1234;
cout<<to_string(d) <<endl;

cout<<"----------整数数->>字符串转换-------------"<<endl;
int in = 2147483647;
cout<<to_string(in)<<endl;
long lg = 2147483648;
cout<<to_string(lg)<<endl; //-2147483648

字符串模式匹配

sscanf和sprintf

适用场景

输入一组数据,从数据中筛选出符合格式的数字或字符串进行其他处理

sscanf 将字符串a格式化到temp变量中,如果不是double类型也有数据,但是sprintf后格式不匹配为0.00

%lf换成%f不可以,因为%f接收的是float型数据,而temp是double型数据

sprintf 将temp格式化到字符串b中,如果不是double型,b匹配不成功为0;

如果类型不符,b为0.00;比如sscanf接收 aab1234.12,temp有值,但是sprintf输出为0.00
如有小数点后位数大于格化式要求,b匹配时会四舍五入;

代码

#include <iostream>
#include <string>
using namespace std;
int main() {
	char a[50], b[50];
	scanf("%s", a);
	double temp;
	/*
	sscanf 将字符串a格式化到temp变量中,如果不是double类型也有数据,但是sprintf后格式不匹配会输出0.00
			%lf换成%f不可以,因为%f接收的是float型数据,而temp是double型数据
	sprintf 将temp格式化到字符串b中,如果不是double型,b匹配不成功为0;
			如果类型不符,b为0.00;比如sscanf接收 aab1234.12,temp有值,但是sprintf输出为0.00
			如有小数点后位数大于格化式要求,b匹配时会四舍五入;

	*/
	sscanf(a, "%lf", &temp);
	sprintf(b, "%.2f",temp);

	cout<<"	a: "<<a<<endl;
	cout<<"	b: "<<b<<endl;
	cout<<"	temp: "<<temp<<endl;
	return 0;
}

测试结果:

abc1234.23
a: abc1234.23
b: 0.00
temp: 2.61855e-322

123.1234
a: 123.1234
b: 123.12
temp: 123.123

123.234
a: 123.234
b: 123.23
temp: 123.234

123.2345678
a: 123.2345678
b: 123.23
temp: 123.235

-23.12
a: -23.12
b: -23.12
temp: -23.12

abcsdasdf
a: abcsdasdf
b: 0.00
temp: 2.61855e-322

123.479
a: 123.479
b: 123.48
temp: 123.479

字符数组

字符数组长度获取

strlen

  • 1 strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)
  • 2 #include 或 #include <string.h>。中没有
#include <cstring>
char a[40];
int alen = strlen(a);

strlen和sizeof的区别

This should not be confused with the size of the array that holds the string. For example:

char mystr[100]="test string";

defines an array of characters with a size of 100 chars, but the C string with which mystr has been initialized has a length of only 11 characters. Therefore, while sizeof(mystr) evaluates to 100strlen(mystr) returns 11.

https://www.cnblogs.com/houzm/p/13370074.html

============

getline():用于读入一整行的数据。在C++中,有两种getline函数。第一种定义在头文件<istream>中,是istream类的成员函数;第二种定义在头文件<string>中,是普通函数。

第一种: 在<istream>中的getline()函数有两种重载形式:

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

作用是: 从istream中读取至多n个字符(包含结束标记符)保存在s对应的数组中。即使还没读够n个字符,如果遇到delim标识符或字数达到限制,则读取终止。delim标识符会被读取,但是不会被保存进s对应的数组中。注意,delim标识符在指定最大字符数n的时候才有效。

复制代码
#include <iostream>
using namespace std;

int main()
{
    char name[256], wolds[256];
    cout<<"Input your name: ";
    cin.getline(name,256);
    cout<<name<<endl;
    cout<<"Input your wolds: ";
    cin.getline(wolds,256,',');
    cout<<wolds<<endl;
    cin.getline(wolds,256,',');
    cout<<wolds<<endl;
    return 0;
}
复制代码

输入

Kevin
Hi,Kevin,morning

输出

Kevin
Hi
Kevin

第二种: 在<string>中的getline函数有四种重载形式:

istream& getline (istream&  is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream&  is, string& str);
istream& getline (istream&& is, string& str);

用法和上第一种类似,但是读取的istream是作为参数is传进函数的。读取的字符串保存在string类型的str中。

is:表示一个输入流,例如cin。

str:string类型的引用,用来存储输入流中的流信息。

delim:char类型的变量,所设置的截断字符;在不自定义设置的情况下,遇到’\n’,则终止输入。

复制代码
#include<iostream>
#include<string>
using namespace std;
int main(){
    string str;
    getline(cin, str, 'A');
    cout<<"The string we have gotten is :"<<str<<'.'<<endl;
    getline(cin, str, 'B');
    cout<<"The string we have gotten is :"<<str<<'.'<<endl;
return 0;}
复制代码

输入

i_am_A_student_from_Beijing

输出

The string we have gotten is :i_am_.
The string we have gotten is :_student_from_.

 

https://www.cnblogs.com/yun-an/p/11458060.html

============

 

参考:

https://www.cnblogs.com/xwxz/p/14719027.html

标签:string,temp,c++,例子,str,字符串,getline,cout
From: https://www.cnblogs.com/rebrobot/p/18219796

相关文章

  • C# String.Format 数值类型格式化字符串 保留两位小数
    统计学中普遍遵循四舍六入五成双例:32.6752-》32.67例:32.6755-》32.67注:String.Format() .framework4.7.2是四舍五入;.net6.net7则符合四舍六入五成双;其余版本没有进行测试。//.framework4.7.2varDistance=32675;vara=String.Format("{0:N2}",Distance/100......
  • 【C++】【YOLO】搭建环境运行YOLO模型,完成目标识别
    1、安装VisualStudio,勾选C++和Python负荷 2、安装CUDA|Pytorch|Python这三者之间的版本关系很重要详情参考:Pycharm搭建CUDA,Pytorch教程(匹配版本,安装,搭建全保姆教程)_cuda12.3对应的pytorch版本-CSDN博客3、下载ultralytics所有代码进行修改(https://github.com/ultralyt......
  • (免费领源码)Java/Mysql数据库+01012大学生爱心互助代购网站,计算机毕业设计项目推荐上万
    摘 要在网络信息的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,企业只能以用户为导向,按品种分类规划,以产品的持续创新作为企业最重要的竞争手段。系统采用了B/S结构,将所有业务模块采用以浏览器交互的模式,选择My......
  • (免费领源码)Java/Mysql数据库+00895springboot的校园二手书销售平台,计算机毕业设计项目
    本科学生毕业设计校园二手书销售平台设计与实现                院系名称:    计算机科学与技术学院    专业班级:                            学生姓名:                           ......
  • (免费领源码)Java/Mysql数据库+00750基于python的音乐电台推荐系统设计,计算机毕业设计项
    毕业设计(论文)Django音乐电台推荐系统学   院:                           专   业:                           年   级:                           姓   名:   ......
  • (免费领源码)Java/Mysql数据库+00485 个性化音乐推荐系统的设计与实现,计算机毕业设计项
    毕业设计(论文)NodeJS个性化音乐推荐系统学   院:                           专   业:                           年   级:                           姓   名:  ......
  • C++数据结构之Hash table(哈希表|散列表)
    目录一、基本组成部分二、使用方法 三、代码实现四、代码中如何遍历链表来避免冲突哈希表(HashTable),也称为散列表(思考:vs平衡二叉树),是一种数据结构,它提供了通过键(key)直接访问存储的值(value)的能力。哈希表的工作原理基于哈希函数(HashFunction),该函数将输入的键映射到表中的......
  • redis数据类型之string,list
    华子目录key操作说明`SCANcursor[MATCHpattern][COUNTcount]``dump`与`restore``keys通配符`示例演示`string`说明`setbitkeyoffsetvalue``getbitkeyoffset``setrangekeyoffsetvalue``List`结构图相关命令`lremkeycountvalue``ltrimkeycountvalu......
  • C#中多态的实际例子及好处与风险
    好处:代码复用:基类的通用行为可以在派生类中重用。灵活性和扩展性:新增派生类时,无需修改现有代码,符合开闭原则。简化设计:使用抽象接口而非具体类进行编程,提高代码抽象层次。潜在风险:性能损失:虚方法调用相比直接调用非虚方法略慢。设计复杂度:过度使用多态可能导致设计过于复......
  • C++ Primer Plus第十八章复习题
    1、使用用大括号括起的初始化列表语法重写下述代码。重写后的代码不应使用数组ar。classz200{private:intj;charch;doublez;public:Z200(intjv,charchv,zv):j(jv),ch(chv),z(zv){}};doublex=8.8;std::strings="whatabracingeff......