贡献者: addis
可以用 C++ 解释器 Cling 方便测试。printf
参考 C 语言笔记。
"abc" "def"
(中间可以换行)相当于 "abcdef"
。
u8"..."
指定对字符串使用 UTF-8 编码(一些编译器不加 u8
也默认使用 UTF-8),U"..."
用于把字符串转换为 UTF-32 编码(basic_string<char32_t>
类型)。这和源码文件的字符编码无关(首先确保你的文本文件使用编译器指定的编码)。
R"(一些字符串)"
是 raw string R"delimiter(一些字符串)delimiter"
是更安全的裸字符串。
u8_iter
。
\0数字
(8 进制)或 \x数字
(16 进制)来指定某个不好表示的字符。
R"(一些字符)"
。里面的字符不会被 escape。若要更裸一点,还可以用 R"自定义标志(一些字符)自定义标志"
。中间的 一些字符
可以换行。
const char *
输入字符串(会需要手打很多 .c_str()
)。或者其次用 const string&
加上一个 index 指明起始位置,或者用 C++17 的 string_view
。
std::tolower()
变为小写,std::toupper()
变为大写,std::isalpha()
是字母,std::isdigit()
是数字。
\0
结尾的字符串.
strlen()
函数用于返回字符串长度(不包括 \0
), 返回类型是 size_t
. 对于 wchar_t
字符串, 用 wcslen()
.
int strcmp(pstr1, pstr2)
比较两个字符串,若返回 0
则相等,小于零则不相等且第一个字符串较小,大于零则较大。大小的比较使用 lexicographic 顺序,即逐个字节比较值的大小,第一个不同的字节决定大小。若 str1
是 str2
的开头的一小部分,那么 str1
较小(因为 \0
肯定更小)。
strcpy(pstr1, pstr2)
把 pstr2
指向的字符串拷贝的 pstr1
的地址。如果 pstr1
分配的长度不够,会继续往后写产生内存错误。更安全的版本是 errno_t strcpy_s(char *dest, rsize_t destsz, const char *src);
。如果成功,返回 0,若失败,dest
被设为空字符串。另一个安全版本是 char *strncpy(char *destination, const char *source, size_t num);
。num
是最多复制的字符数,超出该长度的部分会被忽略。
char *strcat(char *dest, const char *src);
把 src
添加到 dest
末尾(若没有分配足够的空间则会内存溢出)返回 dest
。一个更安全的函数是 char *strncat(char *destination, const char *source, size_t num);
。如果 source
的长度大于 num
,那么只会赋值 num
个。
char *result = strstr(string, substring);
可以查找子字符串,若找不到返回空指针。
#include <string>
, use string
.
string s1;
, string s2{s1};
, string s3{"something"};
, string s4(10, 'c');
string::empty()
判断是否是空.
string::size()
返回字符数.
str[n]
可以直接读取或赋值某个字符.
str1 + str2
可以连接两个字符串.
str1 + "something"
可以连接 string 和 literal, 但不能是 wchar_t
.
str1 == str2
, str1 != str2
可以比较字符串是否相同.
size_t string::find(char或const string&, size_t start)
;若找不到,返回 string::npos
(no position 的缩写),这和 numeric_limits<size_t>::max()
是一样的。若嫌麻烦也可以 using string::npos
。
str.erase(ind,len)
可以删除一个子串,str.erase(ind)
可以删除 ind
开始的所有东西。ind+len
可以超出边界。
str.replace(ind,len,new_str)
可以替换子字符串,同样 ind+len
可以超出边界。
key
,见 SLISC 的 replace(str,key,new_str)
。
str.starts_with("abc")
和 str.ends_with("abc")
可以检查字符串开头和结尾。也可以自己写一个:
bool startsWith(const string& fullString, const string& starting) {
return fullString.size() >= starting.size() &&
std::equal(starting.begin(), starting.end(), fullString.begin());
}
+,-
号,然后跟一串数字,直到遇见非数字。
stoi, stol, stoll
(C++)(例如 int stoi(const string &str, size_t *pos = nullptr, int base = 10);
)pos
用于输出处理了多少个字符。但是缺点是如果处理子串,需要生成一个新的字符串,进行不必要的复制和内存分配。如果出错会 throw
。
strtol, strtoll
(不存在 strtoi
)(C 语言)例如 long strtol(const char* str, char** str_end, int base)
,str_end
会指向处理完的后一个字符。如果出错,会把 errno
设为 ERANGE
(在调用前要手动先设为 0
,比较麻烦)。
atoi, atol, atoll
(C 语言)(ascii to integer 的缩写)例如 int atoi( const char* str );
。不建议用,因为如果超出 int
范围的行为没有定义,如果转换不了会返回 0。
wchart_t
类型的 literal 例如 L"this is a string"
<< endl
用于换行且 cout.flush()
(把缓存立即输出)。
cin >>
会忽略任意多个空格和回车,以及 tab
等空白字符。读取字符串时,遇到空白字符结束。如果 parse 错误或者遇到 EOF,则不会赋值,并设置相应的错误 bit。此时如果 if(cin)
,就会转换为 false
。
<< hex <<
把后面的数字都变成 16 进制, << dec <<
把后面的数字都变成 10 进制.
cin.getline(char* s, streamsize n, char delim)
用于读取一个 char[] name
, 不超过 n
个字符(一般设为 s
的长度),到 delim
之前停止。然后存在 s
里面, 后面加上 \0
.
std::getline(std::istream& input, std::string& str, char delim);
功能也类似,只是输出的类型改变。
cout.precision(N);
可以控制输出的有效数字位数.
<< std::fixed
可以把后面的浮点数都不适用科学计数法 << std::setprecision(3)
在非科学计数法中规定小数点后的位数。所以二者一起使用就是定点定位数小数。如果单独使用 << std::setprecision(3)
,就取 3 为有效数字而不是小数,输出的字符串可能是科学计数法。
setw(n)
用于把两个数字的间隔控制在 n 个字节之内. (用于列对齐).
setprecision(n)
用于显示 n 位小数.
setiosflags(ios::left)
用于左对齐, 另有 ios::fixed
(非科学计数法) 或 ios::right
.
0
开头的字节都是 ascii 字符。
10
开头的字节都不是字符的起始字节,不是字符起始的字节都是 10
开头的。
110
开头的字节是用 2 个字节表示一个字符。
1110
开头的字节用 3 个字节表示一个字符。
11110
开头的字节用 4 个字节表示一个字符。
string::find()
可以正常使用。
string::find_first_of()
这样的函数就用不了了。因为单个字符一般也要用字符串来表示。
basic_string<char32_t>
和 U"字符串"
最容易,体验和 python 差不多。但许多人还是喜欢 utf-8(甚至微软的 utf-16)。
CString(TCHAR str)
可以把 str
从 TCHAR
转换成 CString
.
CString Class
需要 #include <atlstr.h>
wcout << str.GetString()
. str 是 CString 的一个 object.
Format
函数可以把数值转换为 cstring
. int num; CString str{}; str.Format(_T("%d"), num);
CString::GetLength()
函数可以返回字符个数.
CString::GetAt()
可以获取某个字符
CString::Left(int count)
获取左边 count 个字符 CString::Right 同理.
CString::GetMid(int start, int count)
可以获取 substring
CString::Delete(int index, ind nCount)
函数可以删除从第 index 到 index + nCount -1 的 nCount 个字符.
CString::Insert(ind index, CString str)
可以把 str 插入到 index 的位置.
CString CString::Left(int nCount)
提取前 nCount 个字符.
wcout
输出中文, 要添加头文件 <io.h>
和 <fcntl.h>
, 然后添加命令 _setmode(_fileno(stdout), _O_U16TEXT);
要还原, 添加 _setmode(_fileno(stdout), _O_TEXT);
注意只有在两条命令之间可以输出中文, 且不能使用 cout.