fbpixel
Etiquetas: ,
5
(1)

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

How useful was this post?

Click on a star to rate it!

Average rating 5 / 5. Vote count: 1

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?