编程语言
首页 > 编程语言> > c++字符串

c++字符串

作者:互联网

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

/*
1,    C语言中字符用单引号,字符串用双引号
    由于C语言中没有真正的字符串类型,可以通过字符数组表示字符串,因为它的元素地址是连续的,这就足够了
    
    C语言中字符串的表示:
    一是定义一个字符指针,并把该字符串首字符的地址传给他;      char *name = "abc";
    二是定义一个字符数组,并把字符串存入该字符数组中。            char name[] = "abc";
    两种方式都行,但是第一种 name 是指针,代表一个地址,是不能改的
    第二种是字符数组, name是可以改的
    
    对于字符数组,其长度是固定的,其中任何一个数组元素都可以为 null 字符。因此,字符数组不一定是字符串。
    对于字符串,它一定是字符数组,它是最后一个字符为 null 字符的字符数组。
    对于字符指针,是把字符串首字符的地址传给他, C语言中操作字符串是通过它在内存中的存储单元的首地址进行的
    

2,C++ 提供了以下两种类型的字符串表示形式:
        C 风格字符串;
        C++ 引入的 string 类类型 string
3,C++中char是字符类型,是一种基本数据类型,而string是一个模板类,实例化的是对象,它的内部是封装了const char*类型

4,C语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了许多指针和数组的迷惑,
  C语言中规定数组代表数组所在内存位置的首地址,也是 str[0]的地址,即str = &str[0];
*/


/*
2,转换
*/


/*
3,常用方法
    C++ 中有大量的函数用来操作以 null 结尾的字符串:
    strcpy(s1, s2);            复制字符串 s2 到字符串 s1。
    strlen(s1);                返回字符串 s1 的长度。
    strchr(s1, ch);            返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
    strstr(s1, s2);            返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

    C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。
*/


int main(void)
{
    /*字符数组赋初值*/
    char cArr[] = { 'I','L','O','V','E','C' }; // 等价于 char cArr[6] = {'I','L','O','V','E','C'};这是字符数组,不是字符串
    /*字符串赋初值---字符数组*/
    char sArr[] = "ILOVEC"; // 编译时会自动在末尾增加一个null字符(也就是'\0')等价于char cArr[7] = {'I','L','O','V','E','C','\0'}. 等价于char sArr[7] = "ILOVEC";
    /*字符串赋初值---字符指针*/
    char *p = "ILOVEC"; // 字符指针,把字符串首字符的地址传给他,char *p 只是一个保存字符串首地址的指针变量
    
    /*用sizeof()求长度*/
    printf("cArr的长度=%d\n", sizeof(cArr)); // cArr的长度=6
    printf("sArr的长度=%d\n", sizeof(sArr)); // sArr的长度=7
    printf("p的长度=%d\n", sizeof(p)); // sArr的长度=8,这里得到是指针的长度
    /*用strlen()求长度*/
    printf("cArr的长度=%d\n", strlen(cArr)); // 随机值,因为这里不知道'/0'在哪里,所以我们这里的长度时要直到遇到‘/0’才会结束。
    printf("sArr的长度=%d\n", strlen(sArr)); // sArr的长度=6
    printf("p的长度=%d\n", strlen(p)); // sArr的长度=6,这里得到的是字符串长度
    /*用printf的%s打印内容*/
    printf("cArr的内容=%s\n", cArr); // 对字符数组,很显然使用 printf 的 %s 打印其内容是不合适的,因为不知道'/0'在哪里,
    printf("sArr的内容=%s\n", sArr); // 对于字符串 sArr,可以直接使用 printf 的 %s 打印其内容
    printf("p的内容=%s\n", p); // 对于字符串 sArr,可以直接使用 printf 的 %s 打印其内容

    return 0; 
}


// 转换
int test() {

    // char[] 转 char*, 直接赋值
    char str1[] = "abc";
    char *str11 = str1;

    // char* 转 char[], 字符拷贝
    const char * str = "abc";
    char str2[10] = {0}; // 这里10个元素会被赋值为 null 字符(空字符,就是指'\0')
    // char *strncpy(char *dest, const char *src, size_t n) 把src所指向的字符串复制到dest,最多复制 n 个字符
    strncpy(str2, str, strlen(str) + 1);

    // char*转string
    const char *str = "abcd";
    string str1 = str; //赋值转换
    string str2(str, str + strlen(str));//构造转换

    //string转char*:赋值转换
    string str44 = "abc";
    char *str1 = const_cast<char *>(str44.c_str()); //const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性
    const char *str2 = str44.c_str(); // c_str()函数返回一个指向C字符串的指针常量,指向的内容是字符串对象的当前内容加上一个额外的终止字符(‘\ 0’)
    cout << "str1:" << str1 <<"  "  << "str2:" << str2 << endl;

    // char[]转string
    char str44[] = "abc";
    string str1 = str44;

    // string转char[]
    string str55 = "12345";
    char str21[5] = { 0 };
    strncpy(str21, str55.c_str(), str55.length() + 1);
    
    return 0;
}

 

标签:字符,c++,char,sArr,str,printf,字符串
来源: https://www.cnblogs.com/cc-world/p/16451973.html