• C艹复合类型(字符串)


    在C艹中有两种字符串形式, 一种是C-风格, 另一种是C艹风格的

    初始化:

    char str[10] = {'a', 'c', 'd', ''};
    char
    str[20]= “aaa”;
    string str = "aaa";
    #include <iostream>
    #include <cstring>
    
    int main(int argc, char const *argv[]) {
      /* code */
      using namespace std;
      const int Size = 15;
    
      char name1[Size];
      char name2[Size] = "C++owboy";
    
      std::cout << "name2 is :" << name2 << '
    ';
      std::cout << "name1 :";
      std::cin >> name1;
      std::cout << "hi, " << name1 << '
    ';
      std::cout << "name1 strlen is : " << strlen(name1) << '
    ';
      std::cout << "sizeof (name1) value: " << sizeof (name1) << '
    ';
      std::cout << name1[0] << '
    ';
      name2[3] = '';
      std::cout << "name2 is " << name2 << '
    ';
      return 0;
    }

    strlen 和size

    #include <cstring>
    strlen() 判断字符串的长度 与sizeof的区别
    str.size() 属于类方法, str属于对象

    string str2 = "panther";
    str2.size()
    int len2 = strlen(charr2); C-风格
    确定字符数

    cin的getline和get的区别

    std::cin.get(dessert, ArSize).get(); 
    
    与
    
    std::cin.getline(dessert, ArSize) 假设arsize为20, 则实际是取19个, 最后一个为0
    
    的区别

    get()函数的弊端:

      cin.get(name, 20);

      cin.get(dessert, 20);

      由于第一次调用后, 换行符将留在输入队列中, 因此第二次调用时看到的第一个字符便是换行符。因此get()认为已到达行尾, 因此不能获取换行符。

      幸运的是get() 有另一种变体, 使用不带任何参数的cin.get()可以读取下一个字符(即换行符)

    混合输入字符和数字(有问题,指针时候会解)

    字符串的复制和追加

    string库里的strcat()就是追加的意思
    通过strcat 得知 使用使用string而不是使用c字符串的好处

    例如:
        char site[10] = "house";
        strcat(site, " of pancakes");

    函数试图将全部12个字符复制到数组site里, 这将覆盖相邻的内存, 可能导致程序终止,或者损坏数据。
    string类具有自动调整大小的功能, 可以避免发生。

    c里面也有类似函数 strncat() 和strncpy() ,他们接受指出目标数组最大允许长度的第三参数, 但增加写程序的难度

    string库里的strcpy()就是复制的意思, 并创建新的内存地址 printf("%p ", str1);

    看指针不一样,证明复制相当于重新创建一个

    c++风格字符串输入处理与C-风格字符串输入有什么优势和好处

    #include <iostream>
    #include <cstring>
    #include <string>
    
    int main(int argc, char const *argv[]) {
      using namespace std;
      char charr[20];
      string str;
    
      std::cout << "Length of string in charr before input: " << strlen(charr) << '
    ';
      std::cout << "Length of string in str before input: " << str.size() << '
    ';
    
      std::cout << "Enter a line of text: " << '
    ';
      std::cin.getline(charr, 20);
      std::cout << "You entered: " << charr << '
    ';
    
      std::cout << "Enter a line of text: " << '
    ';
      getline(std::cin, str);
      std::cout << "You entered: " << str << '
    ';
    
      std::cout << "Length of string in charr after input: " << strlen(charr) << '
    ';
      std::cout << "Length of string in str after input: " << str.size() << '
    ';
    
      return 0;
    }

    看,我超过范围了造成 溢出, 那么str就不让我输入了

    不知道有认真的人注意到了  getline(std::cin, str); 和std::cin.getline(charr, 20); 的区别了吗

    我们来分析一下

     那么来分析一下为什么?

    函数getline()是istream类的一个方法, cin是istream一个对象, 第一个参数是目标数组, 第二个参数是数组长度, getline()使用它来避免越界溢出。

    那么:

      getline(std::cin, str);

    这个getline()不是类方法, 是将cin作为参数, 指出到哪里查找输入。另外没有指出字符串长度的参数, 因此string对象将根据字符串的长度自动调整自己的大小

    其他类型字符串

    1. C艹还要其他类型字符串, 比如wchar_t,  C艹11新增加的char16_t 和char32_t, 分别使用前缀L、u、U来表示

      wchar_t title[] = L"Chief Astrogator";
      char16_t name[] = u"Felonia Ripova";
      char32_t car[] = U"Humber Super Snipe";

    2. 还有一种支持Unicode字符串编码的UTF-8方案, 字符可能是1~4个八位组。

       方案是前缀u8来表示这种类型。

    3. 原始字符

    在原始字符里面, 字符表示的就是自己。例如 就是 不是换行符, 不需要使用 来转义了

    那么怎么使用呢?

    cout << R"( Jim "King" Tutt users "
    " instead of endl.)" << '
    ';

    打印出来的是:

    Jim "King" Tutt users "
    " instead of endl.

    如果是标准字符串怎么写:
    cout << “Jim "King" Tutt users "
    " instead of endl." << '
    ';

    在输入原始字符串时候, 按回车键不仅会移到下一行, 还将在原始字符串中添加回车字符。

    --------------------------------------------------

    在原始字符串中包含”),编辑器遇见第一个会结束吗,会。但原始字符串允许字符串开头的" 和 ( 加其他字符, 使用R“+*( ....)+*"。

    例如:

    cout << R"+*("(who would;t?)", she whispered.)+*" << endl;

    也可以将前缀R与其他字符串前缀结合使用。例如Ru,UR等

      

  • 相关阅读:
    前端切图:自制简易音乐播放器
    SEO那些事:一句代码一键分享网站
    POJ 2553 Tarjan
    POJ 2186 Tarjan
    POJ 1236 Tarjan算法
    POJ 1330 Tarjan LCA、ST表(其实可以数组模拟)
    POJ 1470 Tarjan算法
    POJ 1985 求树的直径 两边搜OR DP
    POJ 3687 拓扑排序
    POJ 3522 Kruskal
  • 原文地址:https://www.cnblogs.com/renfanzi/p/7240931.html
Copyright © 2020-2023  润新知