[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] |