字符串 in C/C++
文章首次写于:2023-04-19
更新日志:
20230419:编写了字符串-C、字符串-C++的输入输出
20230916:添加了< String >库、< cctype >库、字符串流 < sstream >库
输入输出
char*
输入
gets(c*)(于C++11取消)
读取至'\n'
或EOF
停止,换行符
不会复制,返回自动添加\0
fgets(c*,Num,Stream)
读取num-1
、'\n'
、EOF
停止,**\n
复制到字符串中**,第n
个字符不读取,返回自动添加\0
fgets()
和gets()
完全不同,fgets()
包含任何结束换行符
默认标准输入流:stdin
getchar()
返回读取字符,常用于抵消,与'\n'
getc(stdin)
等价
输出
puts()
puts(c*)
输出时在末尾添加'\n'
;
fputs()
fputs(c*,stdout)
输出直至'\0'
,不会写入额外字符;
string
输入
std::cin
1 | cin>>s; |
读到任意空白符('\n'
,'\t'
,'\0'
,' '
)停止
getline()
getline(cin,string,delim)
定界字符delim
默认'\n'
;
定界字符提取但不储存,下次读取跳过。
输出
cout<<
1 | cout<<s; |
C++ String 特性
< String >库
常用操作包括:拼接、索引、substr()字串、字典序、长度/大小;
C++除了面向对象语言外,还提供了一些操作符 += 、 [] 等(包括STL通有接口size())
声明
1 | string s; |
初始化
1 | string s; // 默认初始化,一个空白的字符串 |
string类型的读入
1 | string s; |
字符串末尾添加字符
可以用+号和append()函数在函数的末尾添加字符。
1 | string s; |
sting类型变量的访问
string字符串变量访问可以采用at, operator[]来访问指定index对应的字符。其中at有越界检查,如果index越界,无论Debug还是在Release编译的环境下,程序异常跳出执行;operator[]无越界检查,如果index越界,则会取得不可预知的字符。
1 | string s("abcd"); |
string类型的长度
1 | string s = "Hello, world!" |
查找字符串的子字符串
1 | string s = abcdefg, subs = "efg"; |
指向首字符和末尾字符的迭代器(begin,end)
1 | string s("abcdefg"); |
empty(), clear()
empty()可以用来检查字符串是否为空,clear()用来清空字符串。
1 | string s1 = "012345"; |
insert()在指定index处插入字符或字符串
1 | // insert原型函数,在index插入count个字符ch。 |
erase()删除字符
erase()函数有三个原型:
1 | string& erase(size_t pos = 0, size_t n = npos); |
因此erase()总共有三种用法:
1 | erase(pos, n); //删除从pos开始的n个字符,比如erase(0, 1)就是删除第一个字符 |
应用实例:
1 | string str ("This is an example phrase."); |
获取子字符串substr()
函数原型:
string substr(size_t pos = 0, size_t len = npos) const;
功能: 从子字符串中获取想要的子字符串
参数:
- pos: 想要获取的子字符串的第一个字符的位置,如果pos等于字符串长度,则该函数返回一个空字符串,如果等于字符串长度,则该函数返回一个空的字符串,如果该长度大于字符串长度,则抛出一个out_of_range。 注:第一个字符的下标从0开始。
- len: 子字符串中要包含的字符数, string::npos的值表示知道字符串末尾的所有字符。
返回值:带有对象子字符串的字符串对象。
应用实例:
1 | string s1 = "Hello World" |
比较
1 | s1 == s2 |
< cctype >库
1 | int isalnum(int c); //检查字符是否为字母数字 |
字符串流 < sstream >
引用声明:以下关于stringstream的部分来自文章C++字符串流stringstream与string知识介绍与用法小结
stringstream是 C++ 提供的一个字符串流(stream),和之前学过的iostream、fstream有类似的操作方式,要使用stringstream,必须包含其头文件:
1 |
|
< sstream > 库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。一般情况下使用stringstream就足够,因为字符串要频繁的涉及到输入输出。
< sstream > 使用string对象来代替字符数组,这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即便使用了不正确的格式化符也没有危险。
与文件流fstream类似,通过插入器(<<)和析取器(>>)这两个运算符可以直接对stringstream上的数据输入输出,而将stringstream中的全部数据输出则是使用成员函数str(),其有两种形式: 1、void str() //无参形式,用于将stringstream流中的数据以string字符串的形式输出 2、void str (const string& s)//以字符串为参数,用以覆盖stringstream流中的数据 特别需要注意的是:
1 | // 字符串流清零,将流中的数据全部清除 |
示例代码:
1 |
|
ss.clear()成员函数
同文件流fstream中的clear()函数类似,通过clear()成员函数可以清除流的错误状态,主要用在stringstream重复使用时或者多个stringstream对象构造时清空,不然之前的缓冲就停留在输入输出流中。
1 | ss.setstate(std::ios::eofbit);//设置流的状态标志位 |
在对同一个stringstream对象重复赋值,就需要先对流使用clear()函数清空流的状态,此时流占用的内存没有改变,会一直增加(stringstream不主动释放内存),若想改变内存(一般是清除内存,减少内存消耗),需要再配合使用str(“”)清空stringstream的缓存。
1 | stringstream stream; |
运行结果:
1 | Size of ss = 2 |
stringstream与fstream
通过重载的<<和>>运算符可以将文件流中的数据输出到C++字符串中,它们之间的媒介是缓冲区streambuf,可由流的成员函数rdbuf()读取。
1 |
|
stringstream通常是用来做数据转换的,用于字符串与其他变量类型的转换,相比c库的转换,它更加安全,自动和直接。
1 |
|
运行结果:
1 | How are you? 123 1 4.368 |
由上面的代码可知,从stringstream流中的数据输入字符串到一个变量里,是以遇到空格跳到下一个字符串的这样的形式连续读取的。