Cuando empiezas a programar con Arduino, muy rápidamente llegas al uso de las cuerdas. Se utiliza una matriz de caracteres para almacenar el texto. Se utiliza, por ejemplo, para mostrar texto en una pantalla LCD o para enviar un texto al monitor en serie. Este es a menudo el primer ejemplo: enviar «Hello World!» en el monitor de serie. Veremos en este tutorial los métodos de definición y los usos comunes de este tipo de variable.
Hay diferentes maneras de definir caracteres en Arduino
- matriz de caracteres de tipo char
- El tipo String definido en la lengua Arduino
El tipo String es, de hecho, un matriz de caracteres que terminan con un carácter nulo.
Cadena de caracteres
A lo largo de este tutorial, utilizaremos el ejemplo más utilizado en el mundo «Hello World» y lo desglosaremos en detalle.
El tamaño de la matriz de caracteres
Para estudiar las cadenas utilizaremos dos funciones muy prácticas:
- strlen por conocer la longitud de una cadena de caracteres
- sizeof para saber el tamaño del conjunto que contiene la cadena
char str[]="Hello World!"; void setup() { Serial.begin(9600); Serial.println(str); Serial.print("String length :");Serial.println(strlen(str)); Serial.print("Array length :");Serial.println(sizeof(str)); for(int i=0;i<sizeof(str);i++){ Serial.println(str[i]); } Serial.println(F(" end of string")); } void loop() {}
Gracias a este simple ejemplo, ya estamos anotando alguna información interesante. El programa de Arduino añade un carácter nulo al final de la cadena.
Hello World!
String length :12
Array length :13
H
e
l
l
o
W
o
r
l
d
!
end of string
En este ejemplo, nuestra cuerda tiene una longitud de 12. Si definimos explícitamente la longitud de la matriz, debemos añadir el carácter nulo al final de la cadena.
char str[13]="Hello World!"; void setup() { Serial.begin(9600); Serial.println(str); Serial.print("String length :");Serial.println(strlen(str)); Serial.print("Array length :");Serial.println(sizeof(str)); for(int i=0;i<sizeof(str);i++){ Serial.println(str[i]); } Serial.println(F("> end of string")); } void loop() {}
Hello World!
String length :12
Array length :12
H
e
l
l
o
W
o
r
l
d
!
> end of string
Cambiar una cadena de caracteres
El texto de una tabla de caracteres no puede ser cambiado de una vez, el nuevo texto debe ser asignado carácter por carácter.
char chars[]="Hello World!"; void setup() { Serial.begin(9600); Serial.println(F("Delete end of string")); chars[6]=0; Serial.println(chars); Serial.println(F("Replace word")); chars[6]='Y'; chars[7]='o'; chars[8]='u'; chars[9]=0; Serial.println(chars); Serial.print("String length :");Serial.println(strlen(chars)); Serial.print("Array length :");Serial.println(sizeof(chars)); for(int i=0;i<sizeof(chars);i++){ Serial.println(chars[i]); } Serial.println(F(" end of chars")); } void loop() {}
El tamaño de la matriz mantiene el tamaño inicial mientras que el tamaño de la cadena se modifica. Si te desplazas hasta el final de la matriz, puedes ver que los caracteres no han sido borrados o reemplazados. Sabiendo esto, ten cuidado al manipular las cuerdas.
Delete end of string
Hello
Replace word
Hello You
String length :9
Array length :13
H
e
l
l
o
Y
o
u
d
!
end of chars
Concatenación
Otra forma de reemplazar un texto es usar la función strcat(), que permite añadir una cadena al final de otra.
char chars[]="Hello World!"; void setup() { Serial.begin(9600); Serial.println(F("Delete end of string")); chars[6]=0; Serial.println(chars); Serial.println(F("Concat word")); strcat(chars,"You"); Serial.println(chars); Serial.print("String length :");Serial.println(strlen(chars)); Serial.print("Array length :");Serial.println(sizeof(chars)); for(int i=0;i<sizeof(chars);i++){ Serial.println(chars[i]); } Serial.println(F(" end of chars")); } void loop() {}
Este ejemplo es equivalente al código anterior. La función strcat cambiará los caracteres de la cadena. Si quieres mantener la cadena original puedes definir otra cadena y copiar el texto en ella.
Copier un texte
char chars[]="Hello World!"; char str[20]; void setup() { Serial.begin(9600); strcpy(str,chars); str[6]=0; strcat(str,"You"); Serial.println(str); Serial.print("String length :");Serial.println(strlen(str)); Serial.print("Array length :");Serial.println(sizeof(str)); Serial.println(chars); } void loop() {}
Hello You
String length :9
Array length :20
Hello World!
Cuando la cadena de caracteres no esté definida, será necesario definir un tamaño de matriz para que el microprocesador pueda reservar la memoria necesaria.
Comparación de dos cadenas
Incluso si la cadena está contenida en matrices de diferentes tamaños, es posible compararlas usando la función strcmp().
char chars[]="Hello World!"; char str[20]; void setup() { Serial.begin(9600); strcpy(str,chars); Serial.println(chars); if(strcmp(chars,str)==0){ Serial.println("str and chars are the same"); } } void loop() {}
N.B. La prueba lógica equivalente «==» sólo funciona para caracteres individuales (por ejemplo, char c=’c’; Serial.println(c==’c’);).
Funciones a recordar
- tamaño de(str) para saber el tamaño de la matriz
- strlen(str) para saber la longitud de una cadena en una matriz
- strcat(str,str1) añadir str1 al final de str
- strcopy(str1,str) copiar str en str1
- strcmp(str,str1) para comparar dos matrices de caracteres
String Arduino
El objeto String está definido en el lenguaje Arduino y contiene un conjunto de funciones prácticas para manipular las cuerdas.
Tamaño de un String
Para estudiar las cadenas utilizaremos dos funciones muy prácticas:
- str.length() para saber la longitud de un String
- sizeof para saber el tamaño de la variable
String str="Hello World!"; void setup() { Serial.begin(9600); Serial.println(str); Serial.print("String length :");Serial.println(str.length()); Serial.print("Array length :");Serial.println(sizeof(str)); for(int i=0;i<str.length();i++){ Serial.println(str[i]); } Serial.println(F(" end of string")); } void loop() {}
Hello World!
String length :12
Array length :6
H
e
l
l
o
W
o
r
l
d
!
end of string
Modificación de un String
Modificar una palabra con el objeto String es mucho más simple que con la matriz de caracteres.
String str="Hello World!"; void setup() { Serial.begin(9600); Serial.println(str); Serial.println(F("Replace word")); str.replace("World!","You"); Serial.println(str); } void loop() {}
Hello World!
Replace word
Hello You
Concatenación
La concatenación de un objeto de cuerda es tan simple como una adición.
String str="Hello World!"; void setup() { Serial.begin(9600); Serial.println(str); Serial.println(F("Concat word")); str=str+"You"; Serial.println(str); } void loop() {}
Hello World!
Concat word
Hello World!You
Comparación de dos String
Para copiar y comparar cadenas, se pueden utilizar los operadores habituales «=» y «==».
String str="Hello World!"; String str1; void setup() { Serial.begin(9600); str1=str; //copy String if(str==str1){ Serial.println("str and str1 are the same"); } } void loop() {}
Hello World!
str and str1 are the same
Funciones a recordar
- sizeof(str) para saber el tamaño de la matriz
- length(str) para saber la longitud de una cuerda en una matriz
- strcat(str, str1) reemplazar str por str1
- substring(index1, index2) extraer el String de index1 a index2
- indexOf(), lastIndexOf() para encontrar un carácter en el String
Trabajando con String y cadenas de caracteres
En algunos proyectos, puede ser necesario manipular ambos tipos de variables. Es posible cambiar de uno a otro utilizando el constructor String() para cambiar de char a String y utilizando la función toCharArray() para cambiar de String a char.
String str="Hello World!",str1; char chars[]="Hello World!",chars1[20]; void setup() { Serial.begin(9600); str1=String(chars); //convert char to String str.toCharArray(chars1, 20); if(str==str1){ Serial.println("str and str1 are the same"); } if(strcmp(chars,chars1)==0){ Serial.println("chars and chars1 are the same"); } } void loop() {}