当前位置: 首页 > news >正文

C++字符串细节,面试题06

文章目录

  • 22. 字符串
    • 22.1. 字符数组 vs 字符指针 vs 常量字符指针 vs string
    • 22.2. strcpy vs sprintf vs memcpy
    • 22.3. strlen vs length vs size vs sizeof
    • 22.4. 字符串之间的转换
    • 22.5 其他数据类型与字符串之间的转换
    • 22.6 字符串分割

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;  //输出bellocout << p2 << endl; //输出bellodelete[] 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; //输出5cout << sizeof(ctr) << endl; //输出4,在32位环境下,指针占4Bstring str = "Hello";cout << str.length() << endl; //输出5cout << 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 字符串分割

  • 使用","分割字符串,示例如下。
int main() {char str[] = "apple,banana,orange,grape";char* token = strtok(str, ",");while (token != nullptr) {printf("%s\n", token);token = strtok(NULL, ",");}return 0;
}
http://www.lryc.cn/news/349192.html

相关文章:

  • AutoModelForCausalLM.from_pretrained 函数调用本地权重报错
  • 【qt】动态属性
  • Git知识点总结
  • 【数据库】数据库指令
  • 设计模式——状态模式(State)
  • 理解打包好的vue项目结构dist包
  • 24深圳杯C题18页高质量论文+可执行代码+图表
  • Midjourney Imagine API 申请及使用
  • 电子邮箱是什么?怎么申请一个电子邮箱?
  • C++ 并发编程指南(11)原子操作 | 11.4、通过内存序实现顺序模型
  • 【数据结构】栈和队列专题
  • 2024年程序员最应该关注的几件事?
  • 【初阶数据结构】单链表基础OJ题讲解
  • 基于Java的俄罗斯方块游戏的设计与实现
  • Hadoop 3.4.0+HBase2.5.8+ZooKeeper3.8.4+Hive+Sqoop 分布式高可用集群部署安装 大数据系列二
  • umi搭建react项目
  • mybatis-plus之数据源切换事务失效问题
  • vue 百度地图点击marker修改marker图片,其他marker图片不变。
  • 【Javaer学习Python】 1、Django安装
  • SSL协议
  • 什么情况下会造成索引失效?
  • 间隔采样视频的代码
  • C++ QT设计模式 (第二版)
  • 【经验总结】超算互联网服务器 transformers 加载本地模型
  • ubuntu编译pcl时报错
  • Rust中的单元测试
  • ubuntu18.04系统安装pangolin
  • 洛谷P10397题解
  • 【Linux】自动化编译工具——make/makefile(超细图例详解!!)
  • goroutine调度策略