字符串C++

string s;
1.cin读到文件末尾就会返回false,从而导致程序结束,所以while( cin>>s )是可行的;
2.cin遇到“空格”、“TAB”、“回车”、“\0”就结束;
3.遇到字母、数字、空格作为输入的字符串,查找某字符出现的次数时,不仅要注意是字母还是数字,还要注意字母是否区分大小写;
4.创建字符数组的一个可行方法是使用vector容器

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    vector<string> s;
    string temps;
    while( cin>>temps  ){
        s.push_back(temps);     
    }
    for( int i=0;i<s.size();i++ ){
        cout<<s[i]<<endl;
    }
    return 0;
}

5.截取字符串的一部分,可采用substr函数实现

string substr(int pos = 0,int n ) const;
/*
参数1:pos是必填参数
参数2:n是选填参数,表示取多少个字符,不填表示截取到末尾
该函数功能为:返回从pos开始的n个字符组成的字符串,原字符串不被改变
*/
#include <iostream>
#include <string>
using namespace std ;
void main()
{
    string s="ABCD";
    cout << s.substr(2) <<endl ; //从字符串下标为2的地方开始截取,截取到末尾,输出CD
    cout << s.substr(0,2) <<endl ; //从字符串下标为2的地方开始截取,截取长度为2,输出AB
    cout << s.substr(1,2) <<endl ; //输出BC
}

6.int占4个字节,32个二进制位,范围-2^31至2的31次方-1;
char占1个字节,8个二进制位,范围-2^7至2的7次方-1;
short占2个字节,16个二进制位,范围-2^15至2的15次方-1;
long long占8个字节,32个二进制位,范围-2^31至2的31次方-1;
7. B 二级制简写;O 八级制简写;
D 十级制简写;H 十六级制简写;
0x或0X(不区分大小写) 十六进制前缀;
0或0o或0O 八进制前缀;
0b或0B 二进制前缀;
十六进制0~9,A、B、C、D、E、F(abcdef);
8.字符串转数字c++风格

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

int main() {
    string s1 = "456";
    string s2 = "456.2";
    int i = stoi(s1);
    long l = stol(s1);
    float f = stof(s2);
    double d = stod(s2);
    cout<<i<<endl;
    cout<<l<<endl;
    cout<<f<<endl;
    cout<<d<<endl;
}

最后代码运行结果为

456
456
456.2
456.2

数字转字符串

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

int main() {
    int i = 123;
    float f = 1.234;
    double d = 2.012;
    cout<<to_string(i)<<endl;
    cout<<to_string(f)<<endl;
    cout<<to_string(d)<<endl;
}

上面的代码输出结果为:

123
1.234000
2.012000

输出的结果貌似与我们预期有差异,很明显是与浮点数精度相关。
为了控制浮点数的精度,可以使用ostringstream来控制精度。

#include <iostream>
#include <string>
#include<sstream>
using namespace std;

int main() {
    double d = 3.14159265358979;
    cout << d << endl;
    stringstream ss;
    ss.precision(10);
    ss << d;
    cout << ss.str() << endl;
}

上面的代码运行,结果为

3.14159
3.141592654

9.ASCII与数字(0~127)互转
数字转为对应的ASCII码

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	cout<<(char)n<<endl;//若k是整数,将它赋值给字符变量或使用char(k)就得到字符。注意,有些字符是不能在屏幕上显示出来的。
    return 0;
}

ASCII码转为对应的数字

#include <iostream>
using namespace std;
int main()
{
    char c;
    cin>>c;
    cout<<(int)c<<endl;
    return 0;
}

10.memset与fill
memset主要是用来初始化char数组,在给char以外的数组赋值时,只能初始化为0或者-1

char B[20];
memset(B, 1, sizeof(B));
/*
memset(内存地址,1,字节数)这句的意思是要把直定的内存空间的值设置为0x01。
对于char型数组B,正好是每个元素占一个字节,所以这样赋值就是将数组B中所有的元素都赋值为1,没有问题。
*/
int A[20];
memset(A, 1, sizeof(A));
/*
对于int型数组C,每个元素占四个字节。
也就是说将数组C中的每个元素赋值成0x01010101,对应的十进制就是16843009
*/

fill(begin(),end(),value)
fill()可以把数组和容器中的某一段区间赋值为某个相同的值。和memset()不同的是这里的赋值可以是数组类型对应范围中的任意值。
范围: [begin,end)

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    int a[10];
    fill(a,a+5,233);
    for(int i=0;i<10;i++)
        cout<<a[i]<<" ";
    return 0;
}
/*
233 233 233 233 233 0 31 0 0 0
可以看出end()后面的是随机赋值的
*/

11.数字转字符串与字符串转数字
数字转字符串
(1)使用to_string()

int m = 1234566700;
string str = to_string(m);   //系统提供数字转字符 
cout << str << endl;

(2)使用itoa

int n = 100;
char str2[10];
itoa(n,str2,10); //第一个参数为整数,第二个为字符串(char*),第三个为进制 
cout << str2 << endl;

(3)自己写

//整数转为字符串:通过加 '0'字符 
void myitoa(int n, char str[]){
	char temp[128];
	memset(temp,0,sizeof(temp));
	int i(0);
	int j = 0;
	while(n){
		temp[i++] = n%10 + '0';
		n /= 10; 
	}
	//此时为逆序,需要调整为正序 
	while(i>0)
		str[j++] = temp[--i];
} 

字符串转数字
(1)使用stoi()

string s("12345");
int a = stoi(s);
cout << a << endl;

(2)使用atoi()

char str3[10] = "3245345";
long long a = atoi(str3);  
cout << a << endl;

(3)自己写

void myatoi(char str[],int& m){  
	int i(0);
	int temp = 0;
	while(str[i] != '\0'){
		temp = temp*10 + (str[i] -'0');
		++i;
	}
	m = temp; //转换后赋值给m
}

(4)stoi()与atoi()区别
①atoi()的参数是 const char* ,因此对于一个字符串str我们必须调用 c_str()的方法把这个string转换成 const char类型的,而stoi()的参数是const string,不需要转化为 const char*;
②stoi()会做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error!
而atoi()不会做范围检查,如果超出范围的话,超出上界,则输出上界,超出下界,则输出下界;

#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1 = "2147482", s2 = "-214748";
string s3 = "214748666666663", s4 = "-21474836488";
cout << stoi(s1) << endl;
cout << stoi(s2) << endl;
cout << atoi(s3.c_str()) << endl;
cout << atoi(s4.c_str()) << endl;
return 0;
}

12.字符串反转
(1)使用头文件中的reverse(_BIter, _BIter),函数传入的参数是两个迭代器,分别指向字符串的第一个元素和末尾。

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
    string str = "hello world";
    reverse(str.begin(), str.end());
    cout << str;       //"dlrow olleh"
    return 0;
}

(2)使用string类中的逆向迭代器 rbegin()和rend()。注:如果想要反转vector对象中的元素也可用这种方法,利用构造函数构造一个vector对象。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str = "hello world";
    string strReverse(str.rbegin(), str.rend());
    cout << strReverse;          //"dlrow olleh" 
    return 0;
}

13.ASCII码( 0~127 )
空格 32
数字 48~57
大写字母 65~90
小写字母 97~122
14.当输入数据存在非法数据时,要对数据的合法性进行判断;
15.读入含空格的字符串
cin和scanf,在读入字符串时遇到空格、回车、文件结束符都会停止。可用以下方式读入

string str;
getline(cin, str);
cout << str;

16.使用while和for循环时,注意终止条件能否达成,以免陷入死循环;尤其考虑有效数据已经判断完,但未跳出循环,还在判断未赋值的数据容易造成数组越界、堆栈溢出等;
17.#include
islower()函数用来判断一个字符是否为小写字母。

cout << islower('d') << endl;
cout << islower('4') << endl;
cout << islower('A') << endl;
------------结果如下----------
1
0
0

ispuuer()函数用来判断一个字符是否为大写字母。

cout << isupper('a') << endl;
cout << isupper('2') << endl;
cout << isupper('A') << endl;
------------结果如下-----------
0
0
1

isalpha()函数用来判断一个字符是否为字母,如果是字母则返回非零,否则返回零。

cout << isalpha('d') << endl;
cout << isalpha('4') << endl; 
--------结果如下--------
1
0

isalnum()函数用来判断一个字符是否为数字或字母,是则输出非零,否则输出零。

cout << isalnum('d') << endl;
cout << isalnum('4') << endl;
cout << isalnum('.') << endl;
-----------结果如下--------------
1
1
0

isdigit 判断是否为十进制数符(0~9)
isblank(space和\t)和 isspace(space、\t、\r、\n)
18.字符串与字符串之间的赋值

#include<bits/stdc++.h>
using namespace std;

int main(){
	string s = "11111";
	string s2 ="222";
	string s3 = "";
	for(int i=0;i<s.length();i++){
		s2[i] = s[i];
	}
	cout<<s2<<endl;
	for(int i=s2.length();i<s.length();i++){
		s2+=s[i];
	} 
	cout<<s2<<endl;
	s3 = s2;
	cout<<s3<<endl;
	return 0;
} 
/*
111
11111
11111
*/

19.关于cout
(1)cout输出字符串遇到"\0"结束。
(2)‘\0\和"\0"是有区别的,字符串中"\0"不会被识别,也不会被计算到字符串长度中。
(3)字符串被给初值后,后面用’\0’或者"\0"替换字符串中的某个字符,cout都会继续往下输出字符。("\0"不会被识别,而’\0’会输出为空格)
(4)length和size都不会把"\0"计算进去。
(5)字符串中"\0"是结束标志,而’\0’则是空格。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值