Diferencia entre revisiones de «string»

De ArduWiki
Saltar a: navegación, buscar
(Parametros)
(Ejemplo 7)
 
(No se muestran 30 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
== Descripción ==
 
== Descripción ==
En realidad '''string''' o cadena de caracteres no es un tipo de dato y se construye como una matriz de tipo [[char]] con terminación nula.
+
En realidad '''string''' o cadena de caracteres no es un tipo de dato y se construye como una [[matriz]] de tipo [[char]] con terminación nula.
  
 
Las cadenas deben terminar con un carácter nulo (ASCII código 0). Esto permite que funciones como Serial.print() sepan donde terminan las cadenas. De lo contrario, seguirían leyendo los siguientes bits de memoria que ya no pertenece a esa cadena. Esto significa que la cadena tiene que tener espacio para un carácter más que el texto que desea que contenga.
 
Las cadenas deben terminar con un carácter nulo (ASCII código 0). Esto permite que funciones como Serial.print() sepan donde terminan las cadenas. De lo contrario, seguirían leyendo los siguientes bits de memoria que ya no pertenece a esa cadena. Esto significa que la cadena tiene que tener espacio para un carácter más que el texto que desea que contenga.
Línea 6: Línea 6:
 
== Sintaxis ==
 
== Sintaxis ==
 
<pre>
 
<pre>
char variable[] = {valor1, valor2...};
 
 
char variable[] = "valor";
 
char variable[] = "valor";
 +
char variable[] = {'val1', 'val2'...};
 
char* variable = "valor";
 
char* variable = "valor";
 
</pre>
 
</pre>
  
 
== Parametros ==
 
== Parametros ==
;variable: es el nombre de la matriz.
+
;variable:Es el nombre de la matriz.
;valor1: debe ir entre comillas simples. Cada uno.
+
;valor:Es una sola cadena de caracteres entre comillas dobles.
;valor: es una sola cadena de caracteres entre comillas dobles.
+
;valx:Es un carácter entre comillas simples.
 +
 
 +
== Comentarios ==
 +
* Se puede declarar una matriz de tamaño especifico. Ejemplo char cadena_1[15];
 +
* Declarar y asignar una matriz, sin terminal. Ejemplo char cadena_2[8] = {'a','r','d','u','i''n','o'};
 +
* Declarar y asignar una matriz, con terminal. Ejemplo char cadena_3[8] = {'a','r','d','u','i''n','o','\0'};
 +
* Declarar y asignar una matriz. Ejemplo char cadena_4[] = "arduino";
 +
* Declarar y asignar una matriz, dejando espacio en blanco. Ejemplo char cadena_5[15] = "arduino";
 +
* Declarar y asignar una matriz puntero. Ejemplo char* cadena_6[] = {"uno","dos","tres"};
 +
 
 +
{{Nota|Las cadenas deben terminan con un carácter nulo (código ASCII 0), para permitir que las funciones (como [[Serial.print()]]) sepan dónde termina  la cadena. De lo contrario, continuarían leyendo bytes de memoria posteriores que no son realmente parte de la cadena.}}
 +
 
 +
== Matriz de tamaño dinámico ==
 +
Al instanciar una matriz se reserva espacio en la memoria para almacenar sus elementos y una vez creado es imposible cambiar su tamaño, entre otras cosas porque puede no haber espacio suficiente a continuación en la memoria.
 +
 
 +
Pero nada nos impide crear un nueva matriz con el tamaño deseado (más grande o más pequeño), copiar el contenido de la matriz original y finalmente eliminar la matriz original. Así es precisamente como trabaja una matriz de tamaño dinámico. Pues eso es exactamente lo que hace la libreria [https://github.com/luisllamasbinaburo/Arduino-List List].
  
 
== Advertencia ==
 
== Advertencia ==
* Tenga en cuenta, que las matrices de caracteres se conocen como [[string]] con s minúscula y las instancias de la '''clase String'' se denominan cadenas con S mayúscula.  
+
* Tenga en cuenta, que las matrices de caracteres se conocen como '''string''' con s minúscula y las instancias de la '''clase String''' se denominan cadenas con S mayúscula.  
* Tenga en cuenta que, las constantes de cadena especificadas con "comillas dobles" son tratadas como matrices de [[char]] y no como la clase String.
+
* Las constantes de cadena especificadas con "comillas dobles" son tratadas como matrices de [[char]] y no como objetos de la clase [[String]].
* No confundir con la clase [[String]], que forma parte del núcleo a partir de la versión 0019 y es necesario la instancia osea crear un objetos, pero la ventaja es que luego hay muchos métodos disponibles.
+
* Las variables tipo [[char]] deben ser definidos '''siempre''' usando comillas simples. Ver cadena1, cadena2 y cadena3 en ejemplo 1.
* Los datos tipo [[char]] deben ser definidos '''siempre''' usando comillas simples. Ver cadena1, cadena2 y cadena3 en ejemplo 1.
+
* Es posible crear cadenas como '''matriz''' de caracteres usando comillas dobles. Ver cadena4, cadena5 y cadena6 en ejemplo 1.
* Es posible crear cadenas como matriz de caracteres usando comillas dobles. Ver cadena4, cadena5 y cadena6 en ejemplo 1.
+
* Una vez definida una matriz no puede cambiar de tamaño. Ver matriz dinamica.
  
 
== Ejemplo 1==
 
== Ejemplo 1==
Línea 31: Línea 46:
 
# Incializar una matriz con un tamaño explícito y una constante de cadena. Ver cadena5.
 
# Incializar una matriz con un tamaño explícito y una constante de cadena. Ver cadena5.
 
# Inicializar la matriz, dejando espacio extra para una cadena larga. Ver cadena6.
 
# Inicializar la matriz, dejando espacio extra para una cadena larga. Ver cadena6.
 +
# Algunos errores. Ver cadena7 y cadena8.
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
Línea 39: Línea 55:
 
char cadena5[8] = "arduino";
 
char cadena5[8] = "arduino";
 
char cadena6[15] = "arduino";
 
char cadena6[15] = "arduino";
 +
char cadena7 = 'Arduino';          //Error, falta []
 +
char cadena8[] = 'Arduino';        //Error, debes usar comilla doble.
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== Ejemplo 2 ==
 
== Ejemplo 2 ==
En el código siguiente, el asterisco después del tipo de datos char "char *" indica que se trata de una matriz de [[punteros]]. Todos los nombres de matrices son en realidad punteros, así que esto es necesario para hacer una matriz de matrices. Los punteros son una de las partes más esotéricas de C ++ para que los principiantes puedan entender, pero no es necesario entender los punteros en detalle para usarlos de la manera aquí descrita.
+
En el código siguiente, el asterisco después del tipo de datos '''char*''' indica que se trata de una matriz de [[puntero]]. Todos los nombres de matrices son en realidad punteros, así que esto es necesario para hacer una matriz de matrices. Los punteros son una de las partes más esotéricas de C ++ para que los principiantes puedan entender, pero no es necesario entender los punteros en detalle para usarlos de la manera aquí descrita.
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
Línea 55: Línea 73:
 
void setup(){
 
void setup(){
 
   Serial.begin(115200);
 
   Serial.begin(115200);
}
 
void loop(){
 
 
   for (byte i=0; i<6; i++){
 
   for (byte i=0; i<6; i++){
 
       Serial.println(fraces[i]);
 
       Serial.println(fraces[i]);
 
   }
 
   }
  delay(500);
 
 
}
 
}
</syntaxhighlight>
+
void loop(){
 
+
  //Nada
 +
}</syntaxhighlight>
  
 
== Ejemplo 3 ==
 
== Ejemplo 3 ==
Línea 69: Línea 85:
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
#define DEBUG(a) Serial.println(a);
+
char* texto1 = "-12345";   //Es lo mismo que char texto1[] = "-12345";
char* texto1 = "-12345";
+
char* texto2 = "-12.345";  //Es lo mismo que char texto2[] = "-12.345";
char* texto2 = "-12.345";
 
 
   
 
   
 
void setup(){
 
void setup(){
 
   Serial.begin(9600);
 
   Serial.begin(9600);
 
   long valor1 = atol(texto1);
 
   long valor1 = atol(texto1);
   DEBUG(valor1);
+
   Serial.println(valor1);
 
    
 
    
 
   float valor2 = atof(texto2);
 
   float valor2 = atof(texto2);
   DEBUG(valor2);
+
   Serial.println(valor2);
 
}
 
}
 
   
 
   
Línea 95: Línea 110:
  
 
== Ejemplo 5 ==
 
== Ejemplo 5 ==
 +
Para borrar un string se puede usar.
 +
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
char nom = 'Arduino';      //Error
 
 
char nom[] = "Arduino";
 
char nom[] = "Arduino";
 +
nom[0] = '\0';
 +
</syntaxhighlight>
 +
 +
== Ejemplo 6 ==
 +
Para añadir un carácter al final se puede usar. Recuerda que debe haber estacio sufiente en el
 +
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(115200);
 +
  char nom[] = "Arduino";
 +
  byte len = strlen(nom);
 +
  nom[len++] = 's';
 +
  Serial.print(nom);
 +
}
 +
void loop() {
 +
  //Nada
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 7 ==
 +
No se puede crear una [[matriz]] de matrices. Pero si se puede usar punteros a matrices, asi:
 +
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(9600);
 +
  byte cero[] = { 0xA6, 0xD4, 0xAC, 0xF8 };
 +
  byte uno[] = { 0xE9, 0x48, 0xCC, 0xE3 };
 +
  byte dos[] = { 0x46, 0x6F, 0xA5, 0xF8 };
 +
  byte tres[] = { 0xC2, 0x9D, 0xFC, 0x33 };
 +
  byte* matriz[4] = {cero, uno, dos, tres};
 +
  for (byte i=0; i<4; i++){
 +
      for (byte j=0; j<4; j++){
 +
        Serial.print(matriz[i][j], HEX);
 +
        Serial.print(", ");
 +
      }
 +
      Serial.println();
 +
  }
 +
}
 +
 +
void loop() {
 +
  //Nada
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== Vea también ==
 
== Vea también ==
* [[char]]
+
<categorytree mode=all>Tipo dato</categorytree>
* [[String]] - clase
+
 
 +
== Referencias ==
 +
* [https://www.luisllamas.es/convertir-texto-a-numero-arduino/ Convertir texto a numero] - Luis Llamas
 +
* [http://panamahitek.com/tipos-de-datos-arrays-en-arduino/ Tipos de datos: Arrays] - José Villalaz
  
[[Category:Variables]]
+
[[Category:Tipo dato]]

Revisión actual del 14:50 2 feb 2020

Descripción

En realidad string o cadena de caracteres no es un tipo de dato y se construye como una matriz de tipo char con terminación nula.

Las cadenas deben terminar con un carácter nulo (ASCII código 0). Esto permite que funciones como Serial.print() sepan donde terminan las cadenas. De lo contrario, seguirían leyendo los siguientes bits de memoria que ya no pertenece a esa cadena. Esto significa que la cadena tiene que tener espacio para un carácter más que el texto que desea que contenga.

Sintaxis

char variable[] = "valor";
char variable[] = {'val1', 'val2'...};
char* variable = "valor";

Parametros

variable
Es el nombre de la matriz.
valor
Es una sola cadena de caracteres entre comillas dobles.
valx
Es un carácter entre comillas simples.

Comentarios

  • Se puede declarar una matriz de tamaño especifico. Ejemplo char cadena_1[15];
  • Declarar y asignar una matriz, sin terminal. Ejemplo char cadena_2[8] = {'a','r','d','u','in','o'};
  • Declarar y asignar una matriz, con terminal. Ejemplo char cadena_3[8] = {'a','r','d','u','in','o','\0'};
  • Declarar y asignar una matriz. Ejemplo char cadena_4[] = "arduino";
  • Declarar y asignar una matriz, dejando espacio en blanco. Ejemplo char cadena_5[15] = "arduino";
  • Declarar y asignar una matriz puntero. Ejemplo char* cadena_6[] = {"uno","dos","tres"};

Nota: Las cadenas deben terminan con un carácter nulo (código ASCII 0), para permitir que las funciones (como Serial.print()) sepan dónde termina la cadena. De lo contrario, continuarían leyendo bytes de memoria posteriores que no son realmente parte de la cadena.


Matriz de tamaño dinámico

Al instanciar una matriz se reserva espacio en la memoria para almacenar sus elementos y una vez creado es imposible cambiar su tamaño, entre otras cosas porque puede no haber espacio suficiente a continuación en la memoria.

Pero nada nos impide crear un nueva matriz con el tamaño deseado (más grande o más pequeño), copiar el contenido de la matriz original y finalmente eliminar la matriz original. Así es precisamente como trabaja una matriz de tamaño dinámico. Pues eso es exactamente lo que hace la libreria List.

Advertencia

  • Tenga en cuenta, que las matrices de caracteres se conocen como string con s minúscula y las instancias de la clase String se denominan cadenas con S mayúscula.
  • Las constantes de cadena especificadas con "comillas dobles" son tratadas como matrices de char y no como objetos de la clase String.
  • Las variables tipo char deben ser definidos siempre usando comillas simples. Ver cadena1, cadena2 y cadena3 en ejemplo 1.
  • Es posible crear cadenas como matriz de caracteres usando comillas dobles. Ver cadena4, cadena5 y cadena6 en ejemplo 1.
  • Una vez definida una matriz no puede cambiar de tamaño. Ver matriz dinamica.

Ejemplo 1

Posibilidades para la declaración de cadenas

  1. Declarar una matriz de caracteres inicializandola. Ver cadena1.
  2. Declarar una matriz de caracteres (con un carácter extra) y el compilador añadirá el carácter nulo requerido. Ver cadena2.
  3. Agregar explicitamente el caracter nulo. Ver cadena3.
  4. Inicializar una constante de cadena entre comillas; el compilador ajustará el tamaño de la matriz para adaptarse a la cadena y un carácter nulo de terminación. Ver cadena4.
  5. Incializar una matriz con un tamaño explícito y una constante de cadena. Ver cadena5.
  6. Inicializar la matriz, dejando espacio extra para una cadena larga. Ver cadena6.
  7. Algunos errores. Ver cadena7 y cadena8.
char cadena1[15];
char cadena2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
char cadena3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
char cadena4[ ] = "arduino";
char cadena5[8] = "arduino";
char cadena6[15] = "arduino";
char cadena7 = 'Arduino';          //Error, falta []
char cadena8[] = 'Arduino';        //Error, debes usar comilla doble.

Ejemplo 2

En el código siguiente, el asterisco después del tipo de datos char* indica que se trata de una matriz de puntero. Todos los nombres de matrices son en realidad punteros, así que esto es necesario para hacer una matriz de matrices. Los punteros son una de las partes más esotéricas de C ++ para que los principiantes puedan entender, pero no es necesario entender los punteros en detalle para usarlos de la manera aquí descrita.

char* fraces[] = {
   "Esta es la cadena 1", 
   "Esta es la cadena 2", 
   "Esta es la cadena 3",
   "Esta es la cadena 4", 
   "Esta es la cadena 5",
   "Esta es la cadena 6"
};
void setup(){
   Serial.begin(115200);
   for (byte i=0; i<6; i++){
      Serial.println(fraces[i]);
   }
}
void loop(){
  //Nada
}

Ejemplo 3

Como convertir una matriz char en long.

char* texto1 = "-12345";    //Es lo mismo que char texto1[] = "-12345";
char* texto2 = "-12.345";   //Es lo mismo que char texto2[] = "-12.345";
 
void setup(){
   Serial.begin(9600);
   long valor1 = atol(texto1);
   Serial.println(valor1);
  
   float valor2 = atof(texto2);
   Serial.println(valor2);
}
 
void loop(){
   //Nada.
}

Ejemplo 4

En el siguiente ejemplo usuario pretende usar 4K de SRAM cuando Arduino UNO solo tiene 2K.

int var[2000];    //Error

Ejemplo 5

Para borrar un string se puede usar.

char nom[] = "Arduino";
nom[0] = '\0';

Ejemplo 6

Para añadir un carácter al final se puede usar. Recuerda que debe haber estacio sufiente en el

void setup(){ 
   Serial.begin(115200);
   char nom[] = "Arduino";
   byte len = strlen(nom);
   nom[len++] = 's'; 
   Serial.print(nom);
}
void loop() { 
   //Nada
}

Ejemplo 7

No se puede crear una matriz de matrices. Pero si se puede usar punteros a matrices, asi:

void setup(){
   Serial.begin(9600);
   byte cero[] = { 0xA6, 0xD4, 0xAC, 0xF8 };
   byte uno[] = { 0xE9, 0x48, 0xCC, 0xE3 };
   byte dos[] = { 0x46, 0x6F, 0xA5, 0xF8 };
   byte tres[] = { 0xC2, 0x9D, 0xFC, 0x33 };
   byte* matriz[4] = {cero, uno, dos, tres};
   for (byte i=0; i<4; i++){
      for (byte j=0; j<4; j++){
         Serial.print(matriz[i][j], HEX);
         Serial.print(", ");
      }
      Serial.println();
   }
}

void loop() {
   //Nada
}

Vea también

  bool
  byte
  char
  int
  long
  void
  word


Referencias