zoukankan      html  css  js  c++  java
  • 【C++】C++中的字符和字符串

    目录结构:

    contents structure [-]

    标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件,作为标准库的一部分string定义在标准库std中。

    #include <string>//引用头文件
    using std::string;

    1.定义和初始化string

    如何初始化类由类本身决定,一个类可以定义多种初始化对象的方式。

    string s1;//默认初始化
    string s2(s1);//s2是s1的副本
    string s2 = s1;//等价于s2(s1),s2是s1的副本
    string s3("value");//s3是字面值"value"的副本,除了字面值最后的那个空字符外
    string s3 = "value";//等价于s3("value"),s3是字面值"value"的副本
    string s4(n,'c');//把s4初始化为由连续n个字符'c'组成的串

    2.string对象上的操作

    一个类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作。下面是string对象的大多数操作。

    os << s //将s写到输出流os当中,返回os
    is >> s //从输入流is中读取字符串赋给s,字符串以空白分割,返回is
    getline(is,s) //从is中读取一行赋给s,返回is
    s.empty() //s为空返回true否则返回false
    s.size() //返回s中字符的个数
    s[n] //返回s中第n个字符的引用,位置n从0开始
    s1+s2 //返回字符串s1和s2连接后的结果
    s1=s2 //用s2的副本代替s1中原来的字符
    s1==s2 //如果字符串s1和字符串s2中的字符完全一样,则返回true,否则为false
    s1!=s2 //如果字符串s1和字符串s2中的字符不一样,则返回true,否则返回false
    <,<=,>,>= //利用字符在字典中的顺序进行比较,且对字母的大小写敏感

    下面的案例展示部分方法的使用,案例:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main(){
        string s;
        cout << "请输入: 
    ";
        cin >> s;//注意:这里以空格分隔,如果想读取整行数据,可以使用getline方法
    
        cout << "你的输入是: 
    ";
        cout << s << endl;
    
        s = "abc";
        if(s.empty())
            cout << "s是空
    ";
        else
            cout << "s非空
    ";
    
        auto size = s.size();//size()函数的返回值是size_type类型,一种无符号整数类型
        cout << "s size is: " << size << "
    ";
    
        //使用迭代器循环输出每个字符
        for(auto a = begin(s); a!=end(s); a++){
            cout << *a << " ";
        }
        //使用指针循环输出每个字符
        for(char *c = &s[0], c!=&s[s.size()]; c++){
            cout << *c << " ";
        }
        cout << endl;
        return 0;
    }

    begin()返回指向首元素的迭代器,end()返回指向尾元素下一元素的迭代器。

    由于字符串的size()方法的返回值是size_type类型,一种无符号整数类型,所以如果n是一个负数,那么下面的例子总是成立的s.size() < n,因为n会自动转化为一个较大的无符号值。因此需要判断字符串的大小,应该先把s.size()的类型转化为有符号的整形,然后再和n比较。例如:

    #include <string>
    #include <iostream>
    using namespace std;
    
    int main(){
        string s("abc");
        int n = -10;
        cout << (s.size() < n) << "
    ";//比较失败
    
        int size = s.size();//先将size_type转化为有符号类型
        n = -10;
        cout << (size < n) << "
    ";//比较成功
        cout << endl;
    
        return 0;
    }

     输出结果为:

    1
    
    0

    -10是有符号整形,在和无符号整形比较时候,会自动转化为一个较大的无符号整形(只有负数才会发生转化,正数不会发生)。所以正确的思路应该是,先把无符号整形转化为有符号整形,然后再比较。或是两个都是无符号整形。

    3.处理string对象中的字符

    在<cctype>头文件中,定义了一系列的标准字符处理函数。<cctype>是C语言头文件ctype.h的版本。
    下面列举了一些主要函数:

    isalnum(c)//当c是字母或数字时为真
    isalpha(c)//当c是字母时为真
    isdigit(c)//当c是数字时为真
    ispunct(c)//当c是标点符号时为真
    isspace(c)//当c是空格时为真
    islower(c)//当c是小写字母时为真
    isupper(c)//当c是大写字母时为真
    tolower(c)//将c转化为小写字母
    toupper(c)//将c转化为大写字母

    案例:

    #include <string>
    #include <cctype>
    #include <iostream>
    using namespace std;
    
    int main(){
        string str("abc");
        for(auto a : str){
            cout << a << endl;
        }
        for(auto &a : str){
            a = toupper(a);//转化为大写
        }
        for(char *c=&str[0]; c!=&str[str.size()]; c++){
            cout << *c << endl;
        }
        return 0;
    }

    4.C风格字符串

    字符串字面值是一种通用结构的实例,这种结构是从c继承而来的C风格字符串(C-style character string),c风格字符串不是一种类型,而是一种约定俗成的写法,按照书写习惯,一般以空字符结束(null terminated),以空字符结尾的意思就是在字符串的最后一个字符后面加上'',一般利用指针来操作这些字符串。

    同时在c++中的<cstring>头文件中,cstring是C语言头文件string.h的C++版本。

    strlen(p) //返回p的长度,空字符不计算在内
    strcmp(p1,p2) //比较p1和p2的相等性,如果p1==p2,那么返回0。如果p1>p2,那么返回一个正值。如果p1<p2,那么返回一个负值。
    strcat(p1,p2) //将p2附加到p1后,返回p1
    strcpy(p1,p2) //将p2拷贝给p1,返回p1

    在用数组的形式初始化字符数组时,一定要以空字符‘’结尾。在使用字符串初始化字符数组时,会自动在末尾加上空字符''。同时,<cstring>标准库中的方法,都是空字符结尾作为字符结尾的标志,如果未加空字符结尾,那么可能发生意想不到的结果。

    char ch[] = {'C','+','+',''};//这里要以空字符结束
    cout << strlen(ch) << endl;//3
    char ch2[] = "C++";//当把字符串赋值给char[]时,会自动在末尾添加
    
    for(char *c=ch2; *c!=''; c++){
        cout << *c << " ";
    }

    字符数组在使用他的名称的时候,编译器会在不同的位置给他编译成不同的类型。
    例如:

    #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    
    int main(){
            char c[] = {'c','+','+',''};
            for(char *ch=c; *ch!='';ch++)//这里将c编译成首元素的地址
                    cout << *ch << endl;
    
            cout << c << endl;//这里输出数组中的所有元素
    
            int i[]={1,2};
            cout << i << endl;
    
        string s[] = {"a","bc"};
        cout << s << endl;
    
            return 0;
    }

    输入结果:

    c
    +
    +
    c++
    0x7ffc37de8200
    0x7ffc37de81c0

    从结果中可以看出,当单独使用字符数组名称时,它会遍历其中的所有字符。当和指针联合使用时,它会返回首元素的指针。然而其他的数组(int[],string[])都没有这个特性。

    除了上面的写法,还可能会看到下面的这种写法(让一个char指针指向一个字符串字面值常量,不是string):

    char *cp = "c++";//等同于char *cp = "c++";

    这种情况下,cp是一个字符指针。而且在单独使用cp的时候,也会遍历他的所有字符。当使用*cp时代表指向字符的首元素。
    可以使用如下的方式遍历:

    for(char *p = cp; *p!=""; p++)//注意这里是双引号"",不是单引号
        cout << *p << endl;

    如何把一个string转化为char[]数据

    可以使用strcpy,copy来实现:

    #include <iostream>/*cout*/
    #include <string>/*string*/
    #include <cstring>/*strcpy*/
    int main()
    {
        std::string s = "Hello World!";
        char *cstr = new char[s.size() + 1];
        strcpy_s(cstr,strlen(cstr),&s[0]);
       //strcpy(cstr, s.c_str()); // 或者传递 &s[0]    
    
        std::cout << cstr << '
    ';
    delete cstr;
    return 0; }
  • 相关阅读:
    编写 Window 服务程序
    WRF文件打开方式
    Springmvc入门案例(1)
    Springmvc入门案例(1)
    Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
    Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
    Springmvc中提交from之后不跳转不进控制器
    Springmvc中提交from之后不跳转不进控制器
    java向数组中插入元素
    java向数组中插入元素
  • 原文地址:https://www.cnblogs.com/HDK2016/p/10441300.html
Copyright © 2011-2022 走看看