Cómo convertir una cadena en un array de caracteres en C++

Jinku Hu 12 octubre 2023
  1. Usa el método std::basic_string::c_str para convertir la cadena en un array de caracteres
  2. Use el contenedor std::vector para convertir una cadena en un array de caracteres
  3. Usar las operaciones de manipulación de punteros para convertir una cadena en un array de caracteres
Cómo convertir una cadena en un array de caracteres en C++

Este artículo introduce múltiples métodos para convertir los datos de las string en char.

Usa el método std::basic_string::c_str para convertir la cadena en un array de caracteres

Esta versión es la forma de C++ de resolver el problema anterior. Utiliza el método incorporado de clase string c_str que devuelve un puntero a un array de caracteres con terminación nula.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl using std::string;

int main() {
  string tmp_string = "This will be converted to char*";
  auto c_string = tmp_string.c_str();

  cout << c_string << endl;
  return EXIT_SUCCESS;
}

Resultado:

This will be converted to char*

Si tienes intención de modificar los datos almacenados en el puntero devuelto por el método c_str(), primero debes copiar el rango a una ubicación diferente con la función memmove y luego operar en la cadena de caracteres de la siguiente manera:

#include <cstring>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl using std::string;

int main() {
  string tmp_string = "This will be converted to char*";

  char *c_string_copy = new char[tmp_string.length() + 1];
  memmove(c_string_copy, tmp_string.c_str(), tmp_string.length());

  /* do operations on c_string_copy here */

  cout << c_string_copy;
  delete[] c_string_copy;
  return EXIT_SUCCESS;
}

Tenga en cuenta que, puede copiar los datos de c_string utilizando varias funciones como: memcpy, memccpy, mempcpy, strcpy o strncpy, pero ten en cuenta que debes leer las páginas del manual y considerar cuidadosamente sus edge cases/bugs.

Use el contenedor std::vector para convertir una cadena en un array de caracteres

Otra forma es almacenar los carácters de string en un contenedor vector y luego usar sus poderosos métodos incorporados para manipular los datos de forma segura.

#include <iostream>
#include <iterator>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  string tmp_string = "This will be converted to char*\n";

  vector<char> vec_str(tmp_string.begin(), tmp_string.end());
  std::copy(vec_str.begin(), vec_str.end(),
            std::ostream_iterator<char>(cout, ""));

  return EXIT_SUCCESS;
}

Usar las operaciones de manipulación de punteros para convertir una cadena en un array de caracteres

En esta versión, definimos un puntero char llamado tmp_ptr y le asignamos la dirección del primer carácter en tmp_string.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl using std::string;

int main() {
  string tmp_string = "This will be converted to char*\n";
  string mod_string = "I've been overwritten";

  char *tmp_ptr = &tmp_string[0];
  cout << tmp_ptr;

  return EXIT_SUCCESS;
}

Recadena, sin embargo, que modificar los datos en tmp_ptr también alteraría el valor de tmp_string, que puedes ver ejecutando el siguiente ejemplo de código:

#include <cstring>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl using std::string;

int main() {
  string tmp_string = "This will be converted to char*\n";
  string mod_string = "I've been overwritten";

  char *tmp_ptr = &tmp_string[0];
  memmove(tmp_ptr, mod_string.c_str(), mod_string.length());

  cout << tmp_string;
  return EXIT_SUCCESS;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ String

Artículo relacionado - C++ Char