C风格字符串
c风格的字符串实际上是一个char[]数组,结尾以字符'\0'结束
c的字符串操作在以下标准库中
<string.h>
<cstring.h> //c++中的库
strlen(s) // 返回s的长度,不包括字符串结束符null
strcmp(s1, s2) //当s1<s2时,返回值<0 ,当s1=s2时,返回值=0 ,当s1>s2时,返回值>0
strcat(s1, s2) // 将字符串s2连接到s1后,并返回s1
//strncat_s 安全版本要求指定目的地址的长度
strcat_s(s1, sizeof(s1), s2)
strcpy(s1, s2) // 将s2复制给s1,并返回s1
//strcpy_s 安全版本要求指定目的地址复制的长度
strcpy(s1, sizeof(s1), s2)
// strncat_s strncpy_s也是相应的安全版本,同样加size参数即可
strncat(s1, s2, n) // 将s2的前n个字符连接到s1后面,并返回s1
strncpy(s1, s2, n) // 将s2的前n个字符复制给s1,并返回s1
strcspn(s1, ',') //s1中遇到','时的长度
//分割字符串
strtok(s,',') //第一次调用时返回第一段字符串 再调用时用strtok(NULL,',')返回第二段字符串
//安全版本strtok_s
char* buf;
strtok_s(s, ',', &buf)
strchr(s, 's') //return char* which pointer to 's' first location in s
strrchr(s, 's') //return char* which pointer to 's' last location in s
memset(void * ptr, int value, size_t num) //从ptr开始的num字节设置为 value
memcpy(void * dest, const void * src, size_t n) //将src的前n个字节复制到dest
<stdlib.h>
<cstdlib.h> //c++中的库
atoi() //字符串转整数
atof() //字符串转浮点数
atol() //字符串转long
atoll() //字符串转long long
a = "48, 50"
char* pEnd;
strtod(a, &pEnd); //a=48 pEnd 指向逗号
strtof(a, &pEnd)
strtol(a, &pEnd)
strtold(a, &pEnd)
strtoll(a, &pEnd)
strtoul(a, &pEnd)
strtoull(a, &pEnd)
<ctype.h> 对单个字符的操作
<cctype.h> //c++中的库
tolower(c) // 转换为小写
toupper(c) // 转换为大写
isalpha(c) // 是否为字母
isupper(c) // 是否为大写字母
islower(c) // 是否为小写字母
isdigit(c) // 是否为数字
isxdigit(c) //是否为16进制数字(数字 & A~F & a~f)
isalnum(c) // 是否为字母及数字
ispunct(c) // 是否为标点符号
isspace(c) // 是否为空白字符(空格、\r(CR)、\n(LF)、\t(TAB)、\v(VT)、\f(FF))
iscntrl(c) // 是否为控制字符(ASCII 0 ~ 37(0x1F) & 177(0x7F))
isgraph(c) // 是否为可显示字符(字母 & 数字 & 标点)
isprint(c) // 是否为可打印字符(字母 & 数字 & 标点 & 空白)
string与char的转换
char a = 'a';
string b;
//char转string
b.push_back(a);
//string转char
char a = b[0];
string与char*的转换
const char* a = "abc";
string b = "abc";
//const char*转string
string c = string(a);
//string转const char*
const char* d = b.c_str();
//string转非null结尾的const char*
b.data()
C++ string类型
<string.h>
string a = "abc";
string b;
a.capacity()
a.length()
a.size()
a.empty()
a.copy()
getline(cin, b);
a.append("bcd");
a.append("bcd",0,2);
a.substr(0,2);
//查找 失败时返回string::npos
a.find("b") //return 1
a.rfind("b") //从右向左查找
a.find_first_of("c")
a.find_last_of("c")
a.replace(0,2,"bcd") //return "bcdc"
a.insert(1,"bcd") // return "abcdbc"
a.erase(1,1) //return "ac"
//迭代器
a.begin()
a.end();
a.rbegin();
a.rend();
StringStream
在C++中基本格式转换与字符串的格式化非常适合用StringStream来实现
stringsteam ss;
string b;
//int到string的转换,其他类型转换类似
ss << 2;
ss >> b;
stringstring ss;
ss.width(8);
ss<<"abc";
ss.width(8);
ss<<"bcd";
cout << ss.str() << endl; //return " abc bcd"
流格式控制
流格式控制有两种基本方式一种是流函数设置一种是流控制符
cout << setw(8) << 1.23 //return " 1.23"
cout << setprecision(2) << 1.233 //return 1.2;
cout << setfill('a') <<setw(8) << 234 // return "aaaaa234";
流程员函数 | 控制符 | 作用 |
---|---|---|
precision(n) | setprecision(n) | 实数位数 |
width(n) | setw(n) | 设置字位宽 |
fill(c) | setfill(c) | 填充字符c |
setf() | sefiosflags() | 设置输出控制符见下表 |
格式标志 | 作用 |
---|---|
ios::left | 输出数据在本域宽范围内向左对齐 |
ios::right | 输出数据在本域宽范围内向右对齐 |
ios::internal | 数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充 |
ios::dec | 设置整数的基数为10 |
ios::oct | 设置整数的基数为8 |
ios::hex | 设置整数的基数为16 |
ios::showbase | 强制输出整数的基数(八进制数以0打头,十六进制数以0x打头) |
ios::showpoint | 强制输出浮点数的小点和尾数0 |
ios::uppercase | 在以科学记数法格式E和以十六进制输出字母时以大写表示 |
ios::showpos | 对正数显示“+”号 |
ios::scientific | 浮点数以科学记数法格式输出 |
ios::fixed | 浮点数以定点格式(小数形式)输出 |
ios::unitbuf | 每次输出之后刷新所有的流 |
ios::stdio | 每次输出之后清除stdout, stderr |