9_5、C++指针:字符数组与字符串


字符串是用双引号括起来的字符序列。比如,“China”。字符串常量会在字符序列末尾添加’\0’作为结尾标记。字符串在内存中按照串中字符的排列顺序存放,并在末尾会添加’\0’作为结尾标记。对于ASCII码来说每个字符占一个字节,而对Unicode码来说每个字符占两个字节。本教程只讲ASCII编码的字符和字符串。
C++和C一样,基本数据类型的变量中没有字符串变量,那怎样处理字符串的存储和操作呢?C语言中用字符数组存放字符串,操作同一般数组类似。C++语言继承了这种方式。除此之外,标准C++库中还定义了string类。

字符数组的声明和使用

字符数组的声明和使用方法和其他类型的数组是一样的。声明字符数组的语法形式为:

char 字符数组名[下标表达式1][下标表达式2]...;
#include <iostream>
using namespace std;
int main()
{
   char str[10] = {'I', ' ','l','o','v','e',' ','y','o','u' };        // 声明和初始化一维字符数组str
   int i;
   for (i=0; i<10; i++)
   {
     cout << str[i];
   }
   cout << endl;
   return 0;
}
  • 字符数组逐个处理数组中的元素,存储的并不是字符串,因为结尾没有结束标记’\0’。

字符串用字符数组存放和处理

在对字符数组进行初始化赋值时,末尾添加了’\0’就构成了字符串,但是用来存放字符串的数组的元素个数应该大于等于字符串的长度加1。为字符数组初始化赋值时,初值可以是用逗号分隔的字符常量或ASCII码,也可以是字符串常量。对于字符串常量,结尾不用显式添加’\0’,'\0’是隐式包含的。

char str[5] = {108,111,118,101,0};      // 以逗号分隔的ASCII码为字符数组初始化赋值
char str[5] = {'l','o','v','e','\0'};   // 以逗号分隔的字符常量为字符数组初始化赋值
char str[5] = "love";

字符串用字符数组存放时,我们可以按照上面的例程中逐个字符处理和输出,还可以将整个字符串一次性输入或者输出。

  • 一次性输入:char str[5]; cin >> str;
  • 一次性输出:char str[5]=“love”; cout << str;

将字符串一次性输入或输出时我们要注意:

  1. 对于字符串结尾标记’\0’,输出字符串不会输出。
  2. 输入多个字符串时需要用空格分隔,若要输入单个字符串则不能有空格,否则会被认为是多个字符串。
  3. 输出字符串时,输出参数是字符数组名,遇到’\0’时输出结束。

string类

可以使用库中的字符串处理函数来处理字符串,比如,strcat用来连接两个字符串,strcpy用来拷贝字符串,strcmp用来进行字符串的比较,strlen用来计算字符串的长度。使用这些函数之前需要先包含头文件string.h。
string类位于C++标准库中。C++从C语言中继承了一些系统函数,另外又自己定义了一些模板和类,这些模板和类逻辑上分为六种类型:输入/输出类、容器类与ADT(抽象数据类型)、存储管理类、算法、错误处理和运行环境支持。

C++标准库中的类的声明分别处于不同的头文件中,我们要使用这些类时就要包含相应的头文件。但是不同的编译器头文件也不同,VC++ 4.1以前的版本中头文件名的形式为“*.h”,VC++ 4.2版本开始就使用符合ANSI标准的标准C++库,可以在不同的编译器间移植,头文件就不再有.h扩展名了,比如,原来的iostream.h文件的新版本文件名为iostream,但C++标准库还是保留了来自C语言的18个带有.h扩展名的头文件。我们在软件开发中,可以使用以前的带有.h扩展名的头文件也可以使用新版本的头文件,编译器会自动判断链接哪一个库。但是注意,不能两种文件混着包含,比如,包含了头文件iostream.h,又包含了新版本头文件string,这种情况是不允许的。

在包含了标准C++库中不带.h扩展名的头文件后,必须加入指定名字空间的语句。例如:

#include      // 包含iostream头文件
using namespace std;    // 指定名字空间std

string类封装了字符串的属性和操作,这些属性包括:字符序列、字符序列的长度、一个字符的大小等等,还提供了一些对字符串的操作:查找、分配、连接和追加等。

string类的构造函数

string();   // 默认构造函数,创建一个长度为0的字符串
string(const string &ths);   // 拷贝构造函数
string(const string &ths, unsigned int pos, unsigned int n);  // 从字符串ths的位置pos(第pos+1个字符)开始取n个字符,用来初始化string类的对象。提示:第i个字符的位置为i-1
string(const char *s, unsigned int n);  // 用指针s指向的字符串中的前n个字符初始化string类的对象
string(unsigned int n, char c);   // 用n个重复的字符c来初始化string类的对象

string类的一些常用成员函数

称成员函数所属对象为“本对象”,其中存放的字符串为“本字符串”。

string append(const char *s);   // 将指针s指向的字符串添加到本字符串尾
string assign(const char *s);   // 讲指针s指向的字符串赋值给本对象
string& insert(unsigned int p0, const char *s);  // 讲s指向的字符串插入到本字符串的位置p0之前
string substr(unsigned int pos, unsigned int n) const;  // 从本字符串的位置pos开始取n个字符构成新的字符串对象返回
unsigned int find(const basic_string &str) const;  // 在本字符串中查找str并返回第一次出现的位置
unsigned int length() const;  // 返回本字符串的长度
void swap(string &str); // 交换本字符串与str的内容
int compare(const string &str) const;  // 比较本字符串与字符串str的大小。若两个字符串相等则返回0,若本字符串小于str,则返回负数,若本字符串大于str,则返回正数。

string类的操作符

操作符举例备注
+‘str1+str2将字符串str1和str2连接成一个字符串
=str1=str2将str2赋值给str1
+=str1+=str2相当于str1=str1+str2
==str1==str2判断str1与str2是否相等
!=str1!=str2判断str1与str2是否不相等
<str1 <= str1<=str2判断str1是否小于等于str2
‘ >str1>str2判断str1是否大于str2
’>=str1>=str2判断str1是否大于等于str2 []

MFC中还有CString类。

在草莓成熟度视觉识别任务中,图像分类是许多智能系统的基础环节,例如传送带分选、单个果实分级、手持设备拍照判定等。然而,当前领域仍面临以下突出痛点:● 类别极度不平衡问题普遍存在:在实际农业场景中,半熟草莓的窗口期极短,采集难度大,导致大多数公开数据集呈现“未熟完熟样本多、半熟样本稀缺”的分布,模型容易忽略半熟类别或将其错误归入相邻类别。● 成熟度过渡状态的视觉歧义性:半熟草莓的外观变化极为连续——同一颗草莓在不同光照、不同角度下可能呈现从粉白到浅红的多种表现,不同标注人员对“半熟”边界的认定差异可达30%以上,导致训练数据标注一致性欠佳。● 跨场景泛化能力差:许多分类数据集在单一光照、单一品种下采集,模型一旦部署到不同大棚、不同品种或不同季节的草莓上,准确率显著下降。● 细粒度分类难度被低估:草莓未熟(白/绿色)、半熟(粉/浅红色)、完熟(深红色)之间的差异本质上属于细粒度视觉分类,通用分类模型(如ResNet)直接应用容易混淆半熟完熟的边界,需要针对性设计。该数据集能够有效解决以下问题:● 真实不平衡场景下的分类建模:本数据集还原了农业实际采集中的天然不平衡分布(未熟最多、完熟次之、半熟最少)。● 轻量级分类模型部署验证:1,623张图片的规模适中,适合快速训练 YOLO、MobileNet、EfficientNet-Lite、RepVGG 等轻量模型,为边缘设备(如手机、草莓分选机嵌入式系统)提供可行性验证。图像分辨率:224x224 像素本数据集共包含 1,623 张 草莓果实图像,类别分布如下:类别英文标签图片数量未熟unripe923半熟semi-ripe217成熟fully-ripe483
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值