C++字符串细节

22. 字符串

22.1. 字符数组 vs 字符指针 vs 常量字符指针 vs string

  • 字符数组 char[]
    • 它将常量字符拷贝到自己的内存空间,再进行读写操作。
    • 它的大小在编译时确定,且固定大小。
  • 字符指针 char*
    • 它指向常量字符的内存空间,不能修改字符串。
    • 只有为它动态分配内存,才能修改。
  • 常量字符指针 const char*
    • 指向常量字符的指针,不能修改字符串内容。
    • 【注意】 如果是 char* 或 char[] 隐式转换成 const char* ,只是不能通过const char* 去修改,可能存在安全隐患。示例如下。
  • string 是C++标准字符串类,封装了字符串的操作和管理。
int main() {

    char c1[] = "hello";
    c1[0] = 'a';

    char* p1 = "hello";
    p1[0] = 'a'; //报错,尝试修改常量字符

    char* p2 = new char[10];
    strcpy(p2, "hello");
    p2[0] = 'a';

    const char* c = p2;  //char* 隐式转换成 const char*
    c[0] = 'b';  //报错,尝试修改常量字符
    p2[0] = 'b';  
    cout << c << endl;  //输出bello
    cout << p2 << endl; //输出bello

	delete[] p2;
    return 0;
}

22.2. strcpy vs sprintf vs memcpy

  • 相同:都可以拷贝。
  • 区别
    • strcpy是字符串之间的拷贝。
    • sprintf是其他数据类型到字符串的转化。
    • memcpy是内存块间的拷贝。
    • 另外,执行效率,memcpy > strcpy > sprintf。示例如下。
struct Person
{
	char name[20];
	int age;
};

int main() {

    char data[100];
    strcpy(data, "hello");

    int num = 1234;
    sprintf(data, "%d", num);

    Person person = { "John",30 };
    memcpy(data, &person, sizeof(Person));

    return 0;
}

22.3. strlen vs length vs size vs sizeof

  • 相同:都是获取大小。
  • 区别
    • strlen位于头文件 < cstring >,获取const char* 长度,包括 char*,char[],因为它们可以隐式转换成const char*。
    • length获取string长度。
    • size除了获取string长度,还可以获取容器长度。
    • sizeof获取对象或类型大小,以字节为单位。示例如下。
int main() {
    const char* ctr = "Hello";
    cout << strlen(ctr) << endl; //输出5
    cout << sizeof(ctr) << endl; //输出4,在32位环境下,指针占4B

    string str = "Hello";
    cout << str.length() << endl; //输出5
    cout << str.size() << endl; //输出5,length和size对string来说没区别
    
    return 0;
}

22.4. 字符串之间的转换

  • string 转 const char*,使用c_str()。
  • const char* 转 char[],使用strcpy()。
  • string 转 char[],使用strcpy(c_str())。
  • const char*,char*, char[] 转 string,直接赋值。
  • char*, char[] 转 const char*,隐式转换。

22.5 其他数据类型与字符串之间的转换

  • const char* 转 int、long和double,分别使用atoi、atol、atof。
  • string 转 int、long、long long、float、double、long double,分别使用stoi、stol、stoll、stof、stod、stold。
  • 数值类型 转 string,使用to_string。

22.6 字符串分割

  • 使用 , 分割字符串,示例如下。
  • 方法1,strtok
  • 方法2,istringstream
#include <iostream>
#include <sstream> //istringstream
using namespace std;

int main()
{
    char str[] = "apple,banana,orange,grape";

    /*auto token = strtok(str, ",");
    while (token)
    {
        cout << token << endl;
        token = strtok(nullptr, ",");
    }*/
    
    istringstream iss(str);
    string token;
    while (getline(iss, token, ','))
    {
        cout << token << endl;
    }

    return 0;
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 字符串格式的图像是指将一张图像转换成一组字符和符号来描述图像的过程。这种方法在计算机图形学和信息处理中得到了广泛应用。通过使用ASCII码或Unicode码中的特定字符和符号,将图像的不同区域用相应的字符填充,再根据字符的数量和位置确定每个区域的灰度值,从而实现图像的转换。 字符串格式的图像具有易于理解和处理的优点,可以在不使用任何专业软件的情况下进行编辑和修改,且占用的空间相对较小。它广泛应用于字符动画、命令行界面、签名档、代码注释等方面。此外,在网络传输中,字符串格式的图像也具有一定的优势,可以节省带宽。 不过,字符串格式的图像也存在一些问题,比如由于字符数量有限,无法准确表达图像的每个细节,导致图像的清晰度和精度受到一定的限制。同时,在处理复杂图像时,字符之间的排列和间距也需要进行优化,否则可能会产生视觉上的错位和模糊。 综上所述,字符串格式的图像虽然存在一些局限性,但仍有广泛应用的前途。随着技术的不断发展,未来其应用领域也将不断扩展。 ### 回答2: 字符串格式的图像,在计算机领域中指的是使用特定的字符来组成图像的一种方式。这种图像通常是基于文本的,使用字母、数字、符号等字符来表示图像的各种特征,而不是使用彩色或灰度像素。 字符串格式的图像在计算机编程、数据处理、图像处理领域中应用广泛。例如,在文本编辑器中用字符画来展示图案,或者用ASCII码字符来表示简单、小时字体的文本。 此外,在数字图像处理中,字符串格式的图像也有一定的应用价值。可以用各种符号来代表像素的灰度值,通过字符的密度和排列方式来表示图像的各种细节和特征。这种方式可以减小图像文件的大小,便于传输和存储。 然而,由于字符串格式的图像分辨率低、色彩单一,因此其表现效果非常有限,无法满足高清晰、高保真的图像需求。 综上所述,字符串格式的图像虽然具有一定的应用价值,但其局限性也是显而易见的。在应用时需要根据实际需求进行选择。 ### 回答3: 字符串格式的图像是指用字符串来表示图像的一种编码方式。它是一种图像压缩技术,将图像的每个像素转化成字符串中的一个字符,从而将图像压缩至原来尺寸的几十分之一。 这种编码方式主要是用于文字信息传输和图像存储,可以节省带宽和存储空间。字符串格式的图像具有传输速度快、占用存储空间少等特点,在移动互联网时代得到了广泛应用。 对于使用字符串格式表示的图像,其还原成图像就是将字符串中的字符按照规则转化成像素点的颜色值,在屏幕上进行呈现。这一过程需要借助于算法和程序进行处理,目前使用较广泛的算法是基于哈夫曼编码的算法。 字符串格式的图像虽然可以实现压缩,但其图像质量相对较低,细节不够清晰,容易出现模糊和失真的情况。因此,在某些对图像质量要求较高的领域,如医疗图像、卫星图像等,其应用还较为有限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值