fbpixel
Etiquetas: ,

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