C++中字符串
C++中字符串:
字符串是存储在内存的连续字节中的一系列字符。(C-style string 和 C++-style string)
一、定义
C-style string 都是以空字符为结尾:'\0'
char dog[] = {'a','b'}; 不是字符串 char dog[] = {'c','d','\0'}; 是字符串
char dog[] = "ef" (和上面的几乎一样) 字符串常量(和上面的差不多):隐式的包含结尾的空字符,字符串读到char数组中,自动加上结尾的空字符。
处理字符串的函数根据空字符位置来处理,而不是数组长度;确定最短数组时,结尾空字符串要计算在内。
eg: char boss[5] = "BZF"; 'B' 'Z' 'F' '\0' '\0'
字符串拼接
cout << "abc" "def\n"; 第一个字符串中的 '\0' 字符将被第二个字符串第一个字符占据; cout << "abc" " def\n"; 所以可以在第二个字符串之前加上空格;
数组中使用字符串 <cstring>
计算字符串长度:strlen(str)(char *类型,string 不行):只计算可见的字符个数,不计算'\0'; sizeof(str):计算整个数组空间长度; 若需要修改数组长度,只需将相应的字符修改成:'\0'
字符串输入;;; string size():可见字符个数
cin >> name[ ] 使用空白:空格、制表符、换行符确定 字符串 结束位置; eg: cin读取一个单词,遇到空格,在这个单词后面加'\0',把剩下的单词放在输入队列中,再次cin时,直接读取了剩下的的单词。
cin>>ch 读单个字符,第二次直接跳过空字符、空格、制表符、回车符
每次读取一行字符串输入
istream 提供了面向行的类成员函数 getline()、get() (两个应该都是带参数的) 都读取一行,直到到达换行符。getline()丢弃换行符,get()将换行符保留在输入队列中
cin.getline(要存储的数组, 要读取的长度len): 读取len-1,剩下一个位置自动添加'\0'。 到达长度/遇到换行符。字符串: Enter--(生成)--换行符--(将换行符替换成 '\0')--空字符--存入相应的数组。
① cin.get(): 不带参数的调用可以读取一个字符(换行符)。get(有参):换行符留在队列中,下一次读取时认为已经到到行尾了,无法跨过换行符。 cin.get(ch): 读取一个字符存入ch
② cin.get(name, ArSize): 编译器知道要将一个字符串放入数组中;返回cin对象,所以可以连用(重载)|| 换行符回车键,要用get()处理掉
两者区别:get()更老,并且可以通过查看下一个字符,确定是读满了,还是读取了整行。
cin.get(ch).get(ch)...才可以连用;;cin.get().get():不可以连用,返回的是int,而不是cin对象
Ⅰ、空行:
get():读取空行后,将设置失效位 failbit。接下来的输入将被阻断。通过 cin.clear() 恢复输入。
Ⅱ、输入字符串比分配的空间长:
如果输入行包含的字符数比指定的多,则getline()、get()将把剩下的字符留在输入队列中,而getline()还会设置失效位,并关闭后面的输入。
eg: cin >> year (cin 遇到空行不会设置failbit位,但是会保留空行; cin遇到空格,停止读取,剩下的空格全部放在输入流中;cin再次读取时忽略所有空读取;但是遇到回车键); cin.getline(address, 80); cin读取了year,将回车键生成的换行符留在输入队列中(第二次直接跳过空字符、空格、制表符、回车符),后面的 cin.getline() 看到换行符,认为是一个空行,将一个空字符串赋给address数组。(cin >> year).get(); 返回cin对象。
用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足.
cin.get(char):返回cin对象,遇到换行符时,转换为false,ch = cin.get():到达文件尾是转换为EOF(int)
get(char &)、get(void): 不跳过空白的单字符输入,直接读取;get(char &):将输入的字符输入给其参数;get(void) 将输入字符转化为整形,返回。
get(char*, int, char)、getline(char*, int, char):读取一行,非格式化输入函数,只读取字符输入,不跳过空白,不进行数据转换。
istream& get(char*, int, char)
istream& get(char*, int)
istream& getline(char*, int, char)
istream& getline(char*, int)
第一个参数用于防止字符串的内存单元地址,第二个参数比要读取的最大字符数大1,第三个参数作为分节符。只有两个参数的版本将换行符做分节符。get() 将分节符留在输入队列中,getline()不保留。
getline遇到回车键,自动生成空字符
cin>> 会跳过空格,加上'\0'
二、string类
string包含在头文件string中,string类位于名称空间std中
可以用数组表示法访问存储在string对象中的字符。string对象可以自动调整字符串长度,安全。
Ⅰ、赋值
可以将一个string对象赋值给另一个string对象,
Ⅱ、拼接
string str3 = str1 + str2;
Ⅲ、附加
str1 += str2;
Ⅳ、其他操作
对于C-风格字符串,使用C语言库中的函数。包含头文件<cstring>
strcpy(charr1, charr2); 将 charr2 拷贝到 charr1 string:str1 = str2;
strcat(charr1, charr2); 将字符串附加到字符数组尾 string:str1 += str2;
int len = strlen(charr1); string:int len = str1.size(); 对于未初始化的char数组,strlen()是不准的,因为未初始化的char数组中的第一个空字符 '\0' 位置是随机的。
Ⅴ、substr() 剪切
假设:string s = "0123456789";
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789" 5之前的都不要了
string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = "567"
Ⅵ read()、peek()、gcount()、putback()
read():读取指定字节数到指定位置,末尾不加上空字符;cin.read(gross, 144)
peek():返回下一个字符,但不抽取输入流中的字符;
putback():将一个字符插入到输入字符串中开头;

浙公网安备 33010602011771号