Ayuda con funcion con vector.

Iniciado por @XSStringManolo, 29 Mayo 2019, 00:17 AM

0 Miembros y 1 Visitante están viendo este tema.

@XSStringManolo

Hola tengo un string que me tiene almacenada una cadena con varios caracteres.
Quiero tomar los caracteres de 6 en 6 y almacenar cada grupo de 6 caracteres en un vector de strings.
Quedandome vector[0] 6 caracteres, vector[1] 6 caracteres...
Si la cantidad de caracteres del string no es divisor de 6 puede que me quede por ejemplo en
vector[5] 2 caracteres. Entonces en ese caso debo rellenar ese ultimo string dentro del vector para que contenga 6 caracteres. Lo estoy intentando hacer de varias maneras distintas y de ninguna lo logro.
Esto es lo que estoy haciendo ahora y tampoco me fuciona:

Código (cpp) [Seleccionar]

int complemento =6;
string cadenaDeCaracteres;
string dividir6;
int x = cadenaDeCaracteres.length();
int z =0;

while (z<x)
{
   for (int i=0; i<complemento; ++i)
   {
   dividir6 + cadenaDeCaracteres[i];
   }
   complemento+=6;
   vector.push_back(dividir6);
   dividir6="";
++z;
}

int a = vector.size();

while ((vector[a]).size() <6)
{
vector[a].append("0");
}


Ya me estoy liando la cabeza, me da errores de varias formas distintas.
estuve a prueba y error y no consegui sacar una funcion que haga lo que pido.
Es para un cifrado de binario a base64.
Gracias.

Loretz

Te paso una solución que creo que podrás acomodar a tu caso:

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>

int main()
{
    std::string cadena{ "Una cadena bastante larga que va a ser dividida en segmentos "
                        "de seis caracteres cada uno, y lo que falte se completara con asteriscos." };

    // nuevo size de la cadena (multiplo de 6)
    auto res = std::div(cadena.size(), 6LL); // calcula cociente y resto.
    size_t newsize = 6LL * res.quot;
    newsize += (res.rem) ? 6LL : 0;
    cadena.resize(newsize, '*'); // de ser necesario se completa con asteriscos.

    // un vector de strings de 6 caracteres cada una:
    std::vector<std::string> v;
    for (auto i = 0LL; i < newsize / 6LL; ++i) {
        v.push_back(cadena.substr(6LL * i, 6LL));
    }

    // a ver...
    for (const auto& i : v) {
        std::cout << i << '\n';
    }
}


@XSStringManolo

Muchas gracias! Mirare como funciona en profundidad para saber como lo puedo hacer en mi caso.

K-YreX

Estaba mirando el problema antes de ver la respuesta anterior así que te dejo una alternativa a la de @Loretz con los operadores más básicos y con arrays dinámicos.
Código (cpp) [Seleccionar]

string cadena_original = "abcde0fghij1kl";
size_t relleno = DIVISOR - (cadena_original.size() % DIVISOR);
for(size_t i = 0; i < relleno; ++i)
cadena_original += '0';

size_t num_subcadenas = cadena_original.size() / DIVISOR;
string *vector_string = new string [num_subcadenas];

for(size_t i = 0; i < num_subcadenas; ++i)
for(size_t j = 0; j < DIVISOR; ++j)
vector_string[i] += cadena_original[i*DIVISOR+j];
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

@XSStringManolo

#4
Me va perfecto YreX-DwX muchas gracias. Ahora solo me falta pasar los binarios a base 64. Cuando acabe el codigo lo comparto, aunque supongo que hay muchos por ahí. Los que yo vi no los entendia demasiado.

Edit: Poca operacion mucho texto plano. Jaja
https://pastebin.com/KRPnJ1gB