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’则是空格。