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():将一个字符插入到输入字符串中开头;

 

posted @ 2020-12-11 10:43  点|滴  阅读(13)  评论(0)    收藏  举报