C++ 字符 字符数组 字符串函数

本文详细介绍了C++中字符数组的初始化、赋值、读取及字符串处理函数等核心概念。同时对比了不同输入输出方法的特点,并阐述了字符串类的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 字符数组初始化

  • char ch[] = {'C', 'h', 'i', 'n', 'a'};    // 数据只占用5个char类型的空间
  • char ch[] = "China";    // 数据占用6个char类型的空间,末尾默认添加'\0'

2. 不能用赋值语句将一个字符串常量字符数组直接赋给另一个字符数组,如下面:
  • str1[ ]= “China”;(赋值,不合法)
  • str1 = “China”;(赋值,不合法)
  • str2 = str1;    (赋值,不合法)

3. 打印输出数组,cout << ch << endl;  //遇到‘\0’结束输入

4. 读入一个字符 (EOF常被作为文件结束的标志)
  • char ch;
  • 方法一:cin >> ch;    // 不读入空格,回车
  • 方法二:ch = cin.get();    // 空格,回车符号同样能读入
  • 方法三:cin.get(ch);    // cin.get(ch) 读入错误返回0
  • 方法四:ch = getchar();    // 不跳过任何字符,包括^Z ,需要#include <stdio.h>

5. 读入一串字符
  • char str[10];
  • 方法一:cin >> str;    // 空格,回车符号会被当做字符串之间的分隔符
  • 方法二:cin.get(str, 10, '\n');    // 读取1-10个字符包括空格;第三个参数代表读取终止符,读取过程中遇到它就终止后面的输入(默认值是‘\n’,缓冲区指针停在当前终止字符的位置);读取成功,返回一个非0值,如果失败,返回0;str字符数组末尾结束符为'\0'
  • 方法三:cin.getline(ch, 10, '\n');    // 读取1-10个字符包括空格;第三个参数代表读取终止符,读取过程中遇到它就终止后面的输入(默认值是‘\n’,缓冲区指针停在当前终止字符之后);读取成功,返回一个非0值,如果失败,返回0;str字符数组的末尾结束符'\0',最多读入有效字符为9位
  • 注意:int num; cin >> num; cin.getline(str, 10);    // getline会读入的字符是缓冲区取出num数之后的'\n'

6. 字符串处理函数(cstring / string.h头文件中)
  • 字符串连接函数:char *strcat(char *dest, char *src);
  • 字符串复制函数:char *strcpy(char* dest, const char *src);
  • 字符串比较函数:int strcmp(const char *s1,const char * s2);// s1>s2,返回正数;s1==s2,返回0;s1<s2,返回负数
  • 字符串长度函数:unsigned int strlen(char *s);// 结果是不包含字符串中的‘\0’

7. 字符串类 (#include <string>)
  • 定义字符串变量:string str1;
  • 字符串赋值:str1 = "This is a string";    string str2 = str1;
  • 字符串输入输出:cin >> str1; cout << str2;
  • 字符串复制:string str3; str3 = str2;
  • 字符串连接:str3 = str2 + str1;
  • 字符串比较直接用关系运算符:>, <, =, !=, >=, <=

附:cin的一些知识
  • (cin>>number) 如果正确读到结果,返回一个非0值;反之,返回0。通过该方法可以实现连续输入。
  • 输入数据结果遇到回车之后,数据才被送入数据缓冲区。
  • 对于cin读取数据,把空格,回车当做数据间隔符,直接跳过。

<think>好的,用户想了解C++字符串字符数组的区别及用法。我需要先回忆一下相关知识,然后结合提供的引用内容来组织回答。首先,根据引用[1],字符数组是固定大小的数组,而字符串是std::string类的对象,动态管理内存。两者在内存分配、操作函数、安全性等方面有区别。需要分别说明它们的定义、初始化、操作方法和注意事项。引用[3]提到字符串数组的初始化方式,例如string array[3]={"li","zhang","wang"},而引用[4]展示了字符数组的初始化例子char arr[5]={'a','v','f','h','e'}。引用[2]则提到转换方法,比如string转const char*。 接下来,我需要分点列出区别,比如内存管理、长度处理、操作函数等。同时要给出示例代码,如字符数组的定义和操作,以及字符串的使用方法。注意要符合用户给出的格式要求,行内数学表达式用$...$,代码块用三个反引号包裹,并正确使用引用标记。最后生成相关问题,可能涉及转换方法、性能比较、应用场景等。需要确保回答结构清晰,内容准确,引用正确来源。</think>### C++字符串 vs 字符数组 区别与用法详解 #### 一、核心区别 1. **内存管理** - **字符数组**:需预先指定固定大小(如`char arr[10]`),存储在栈或静态内存中,长度不可变[^4]。 - **字符串**(`std::string`):动态分配内存,长度可自由扩展,存储在堆中[^1]。 2. **安全性** - 字符数组易因越界访问导致崩溃(如`char arr[5] = "hello"`会溢出)。 - 字符串自动处理内存,避免越界风险。 3. **操作函数** - 字符数组依赖C函数:`strcpy()`, `strcat()`, `strlen()`[^2]。 - 字符串提供成员函数:`.append()`, `.substr()`, `.find()`。 #### 二、具体用法示例 **1. 字符数组** ```cpp // 初始化方式 char arr1[] = {'H', 'e', 'l', 'l', 'o'}; // 需手动添加结束符\0 char arr2[6] = "World"; // 自动补\0 // 操作示例 strcpy(arr2, "Test"); // 覆盖原有内容 cout << strlen(arr2); // 输出4 ``` **2. 字符串** ```cpp #include <string> using namespace std; string s1 = "Hello"; // 动态初始化 string s2(5, 'a'); // 生成"aaaaa" // 常用操作 s1.append(" World"); // 拼接字符串 int pos = s1.find("Wo"); // 返回起始下标 ``` #### 三、转换方法(引用[2]) ```cpp // string转const char* const char* cstr = s1.c_str(); // string转char数组 char buffer[20]; strcpy(buffer, s1.c_str()); // 需保证buffer足够大 ``` #### 四、性能对比 | 特性 | 字符数组 | 字符串 | |-----------------|---------------|---------------| | 内存分配 | 静态/栈 | 动态堆 | | 最大长度 | 固定 | 理论无限制 | | 操作效率 | 高(无额外开销)| 略低(但安全性高)|
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值