Arduino字符串——char数组和String类型-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16261|回复: 7

[拓展] Arduino字符串——char数组和String类型

[复制链接]
发表于 2021-2-4 23:44 | 显示全部楼层 |阅读模式

[md]在Arduino及C++程序中,通常有两种定义字符串的方式: char数组 和 String类。

**char数组**  
char数组是字符元素组成的数组,是最基本最常见的字符串定义方式。其定义方式如下:  
```
char a[] = "arduino";
```

需要注意的是,字符串末尾都有一个不可见的结束符 `\0` 。因此这个字符串虽然有7个字符,但其长度为8字节。可以使用以下代码进行测试:  
```
char a[] = "arduino";
Serial.print("strlen: ");
Serial.println( strlen(a) );
Serial.print("sizeof: ");
Serial.println( sizeof(a) );

```

strlen可以测量字符串的长度,sizeof可以返回变量占用的内存大小。
可以看到,两者输出的结果是不一样的,正是由于char数组有`\0`结束符造成的。

因此这个字符串也可以写作:
```
char a[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
```

但是如果写作:
```
char a[7] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};

```

则该变量只是一个char数组,由于没有结束符,其不能被正确的识别成字符串,在实际运行中如果作为字符串调用,将导致程序出错。

**String类型**  
char数组是C语言中提供的字符串定义方式,在C++中更常使用的方式是String类型。其定义方式如下:  
```
String a = "arduino";
```

String类型除了能存储字符串数据本身,还提供多种成员函数,可以完成一些常用的字符串操作。

**两者区别 及 如何选择**
char数组是C语言中提供的字符串定义方式,在C++中更常使用的方式是String类型,String是现今大多数编程语言中都有一种数据类型,两者在实际使用中差别较大,这里例举一些常用操作方法:

```
char s[] = "Arduino";
String s2 = "Arduino";
// 获取字符串长度
int length = strlen(s);
int length2 = s2.length();

// 截取子字符串
char substr[];
strncpy(substr, a + 4, 3)
String substr2 = s2.substring(4, 6);

// 合并字符串
char str[] = strcat("i love ", s);
String str2 = "i love " + s2

// 将字符串转换为数值
String n="123.12";
long number = n.toInt();
float fnumber = n.toFloat();

char n2[]="123.12";
long number2 = atoi(n2);
float fnumber2 = atof(n2);

```

更多字符串操作方法,可见本书官网:https://clz.me/arduino-book/more/

简单说:

1. 使用char数组的方式虽然较为复杂,但可以更节省存储空间;
2. 在C++环境下,大部分情况推荐使用String类型的字符串;
3. String中提供了很多字符串操作方法并且支持操作符,因此在一些情况下使用String类型相对char数组更简单一些。[/md]
发表于 2021-2-5 18:32 | 显示全部楼层
学习中,顶了
发表于 2021-2-5 19:28 | 显示全部楼层
学习中,顶了
发表于 2021-2-5 19:28 | 显示全部楼层
学习中,顶了
发表于 2021-8-19 14:50 | 显示全部楼层
示例程序有点问题
1、上文为char s[] = "Arduino";  所以截取字符串应该为strncpy(substr, s + 4, 3)
2、char substr[]; 会报错,因为没有定义数组大小

点评

是的,有人反映了,过几天改  详情 回复 发表于 2021-8-22 10:44
 楼主| 发表于 2021-8-22 10:44 | 显示全部楼层
XlinliY.Zhang 发表于 2021-8-19 14:50
示例程序有点问题
1、上文为char s[] = "Arduino";  所以截取字符串应该为strncpy(substr, s + 4, 3)
2、ch ...

是的,有人反映了,过几天改
发表于 2021-11-2 11:48 | 显示全部楼层
奈何大哥V5
发表于 2021-11-12 14:42 | 显示全部楼层
学习了,谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:39 , Processed in 0.123482 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表