Quando começamos a programar com o Arduino, nos deparamos rapidamente com o uso de cadeias de caracteres, ou strings. As cadeias de caracteres permitem armazenar texto e são usadas sobretudo para exibir textos num ecrã LCD ou para enviar textos para um monitor serial. Há um exemplo muito utilizado: a exibição do “Hello World!, uma cadeia de caracteres, no monitor serial. Neste tutorial, veremos os métodos de definição e os usos comuns deste tipo de variável.
Há diferentes maneiras de definir uma cadeia de caracteres no Arduino:
- matriz (ou array) de caracteres do tipo char
- tipo String definido na línguagem Arduino
O tipo String é, na realidade, uma cadeia de caracteres que termina com um caractere nulo.
Matriz de caracteres
Ao longo deste tutorial, vamos usar o exemplo mais popular de todos, o “Hello World”, e dissecá-lo de cabo a rabo.
Tamanho de uma cadeia de caracteres
Para estudar as cadeias, vamos usar duas funções muito práticas:
- strlen para saber o comprimento de uma cadeia de caracteres
- sizeof para saber o tamanho da matriz que contém a cadeia
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() {}
A partir deste exemplo simples, extraímos uma informação interessante: o programa Arduino acrescenta um caractere nulo no final da cadeia.
Hello World!
String length :12
Array length :13
H
e
l
l
o
W
o
r
l
d
!
end of string
O comprimento da cadeia neste exemplo é 12. Se definirmos o comprimento da matriz explicitamente, 13 acrescenta o caractere nulo no fim da cadeia.
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 :13
H
e
l
l
o
W
o
r
l
d
!
> end of string
Modificando uma cadeia de caracteres
O texto de uma cadeia de caracteres não pode ser alterado de uma só vez. O novo texto deve ser atribuído caractere por caractere.
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() {}
Nota-se que o tamanho da matriz permanece o mesmo, enquanto o tamanho da cadeia se modifica. Se percorrermos a matriz até o final, observamos que os caracteres não foram apagados ou substituídos. Sabendo disso, fique atento ao manipular cadeias de caracteres.
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
Concatenação
Outra forma de substituir o texto é utilizar a função strcat(), que acrescenta uma cadeia de caracteres no final de uma outra.
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 exemplo é equivalente ao código anterior. A função strcat modifica a cadeia de caracteres. Se quiser manter a cadeia original, pode definir outro string e copiar o texto nele.
Copiar um texto
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!
Quando a cadeia não é definida, é preciso determinar um tamanho de matriz para que o microprocessador possa reservar a memória necessária.
Comparação de duas cadeias de caracteres
Mesmo que as cadeias estejam contida em matrizes de tamanhos diferentes, é possível compará-las usando a função 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() {}
Nota: o teste lógico equivalente “==” só funciona para caracteres únicos (por exemplo, char c= ‘c’; Serial.println(c==’c’);)
Funções para lembrar
- sizeof(str) para obter o tamanho da matriz;
- strlen(str) para saber o comprimento de uma cadeia numa matriz;
- strcat(str, str1) para adicionar str1 ao final de str;
- strcopy(str1, str) para copiar str para str1;
- strcmp(str,str1) para comparar duas matrizes de caracteres.
String Arduino
O objeto String é definido na linguagem Arduino e contém um conjunto de funções úteis para manipular cadeias de caracteres.
Tamanho de um String
A fim de estudar as cadeias, vamos usar duas funções muito práticas:
- str.length() para saber o comprimento de uma cadeia de caracteres
- sizeof para saber o tamanho da variável
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
Modificação de um String
Modificar uma palavra com o objeto String é muito mais fácil do que com uma 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
Concatenação
A concatenação de objetos String é tão simples quanto uma adição.
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
Comparação de dois Strings
Para copiar e comparar Strings, podemos utilizar os operadores habituais “=” e “==”.
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
Funções para saber:
- sizeof(str) para obter o tamanho da matriz;
- lenght(str) para saber o comprimento de uma cadeia de caracteres numa matriz;
- replace(str, str1) para substituir str por str1
- substring(index1, index2) copia o String do index1 para o index2
- indexOf(), lastIndexOf() para encontrar um caractere no String
Trabalhar com matrizes de caracteres e Strings
Em alguns projetos, pode ser necessário manipular os dois tipos de variáveis. É possível mudar de um para outro, usando o construtor String() para mudar de matriz para String e a função toCharArray() para mudar de String para matriz.
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() {}
Bônus: escrever um texto em várias linhas
Quando o texto do String é longo o suficiente, é possível:
- Escrevê-lo numa única linha, colocando os caracteres de fim de linha (“\n”) e de retorno (\r).
String header="HTTP/1.1 200 OK\n\rContent-Type: text/html\n\r\n\r";
- Concatenar várias cadeias de caracteres para obter o texto desejado.
String header="HTTP/1.1 200 OK\n\r"; header+="Content-Type: text/html\n\r"; header+="\n\r";
Existe um método muito mais prático para visualizar e editar o texto. A tag R determina que o compilador trate o que está entre as tags como um texto.
String header=R"=====( HTTP/1.1 200 OK Content-Type: text/html )=====";
Isso permite modificar todo o texto com um simples copiar e colar.
Fontes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie