1

Estoy intentando convertir stringstream o en un arreglo para que lo pueda iterar y guardarlo dentro de s[i]; para mostrarlo por pantalla, por favor alguien podría hacer una solución en código, el código compila pero el error esta en que cuando compila solo me muestra lo que esta dentro de o y como o no es un arreglo no guarda cada una de las posiciones.

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <sstream>

using namespace std;

int main(){
    
 string s[10];
 stringstream o;
 
 double   n1[10];
 double   n2[10];
 double   n3[10];
 double   n4[10]; 
 
  srand(time(NULL));
  
  for(int i=0;i<10;i++){
  
  n1[i] = 0 + rand() % (255); 
  n2[i] = 0 + rand() % (255); 
  n3[i] = 0 + rand() % (255); 
  n4[i] = 0 + rand() % (255); 
  
 }
 
     for (int i=0;i<1;i++){
    
        o<<n1[i]<<"."<<n2[i]<<"."<<n3[i]<<"."<<n4[i];
    
     }
 
  for (int i=0;i<10;i++){
    
    s[i]=o.str();
    
 }
 
 for (int i=0;i<10;i++){
    
    cout<<s[i]<<endl;
    
 }


    return 0;
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Lo quieres convertir en un arreglo de que forma? Solo leyendo el codgio no queda claro como es que quieres que sea el arreglo resultado. Seria bueno que agregaras eso a la pregunta. – Pablochaches Jun 22 '21 at 02:59

1 Answers1

2

Estoy intentando convertir stringstream o; en un arreglo para que lo pueda iterar

No necesitas convertir un flujo de datos (stream) en nada para poderlo iterar, puedes iterarlo directamente:

std::stringstream s;
s << "test";

for (std::istreambuf_iterator<char> begin{s}, end; begin != end; ++begin)
    std::cout << *begin << '\t';

El código anterior muestra:

t   e   s   t   

iterar y guardarlo dentro de s[i]; para mostrarlo por pantalla

No necesitas iterar ese flujo de texto (stringstream) para guardarlo en una formación de caracteres, puedes guardarlo directamente y las formaciones de caracteres se pueden mostrar por pantalla también directamente:

std::stringstream s;
s << "test";

char formacion[5];
s >> formacion;

std::cout << formacion;

El código anterior muestra:

test

Respondiendo a los comentarios.

El objetivo del código es crear 4 arreglos donde cada una de la posiciones de los 4 arreglos tenga un entero aleatorio entre "0"y"255" lo cual esta en el primer for del código como puedes ver, luego intentar "concatenar" el primer arreglo con un ".", luego esa primera parte con la segunda que es igual pero con el segundo arreglo y así asta llegar al la cuarta parte, y todo eso guardarlo en un arreglo de tipo string y mostrarlo por pantalla – Gregorio Varon Rengifo

Vamos por partes:

  • Usas cabeceras incorrectas: Dado que estás programando en C++, no deberías usar las cabeceras <stdlib.h>, <string.h> ni <time.h> que son de C. Lee este hilo para saber más del tema.
  • Usas cabeceras incorrectasbis: Las cadenas de caracteres de C++ se almacenan en el objeto std::string disponible al incluir directamente la cabecera <string> o al incluirla indirectamente a través de otras cabeceras (como <iostream> o <sstream>), la cabecera <string.h> no te ofrece el objeto std::string.
  • Usas utilidades incorrectas: La generación de números pseudoaleatorios en C++ se lleva a cabo con las utilidades de la cabecera <random>, la utilidad rand (de la cabecera <stdlib.h>) es de C, no de C++.
  • Usas tipos incorrectos: Si pretendes guardar números entre 0 y 255 no deberías usar double como tipo de almacenamiento. El double permite guardar números en coma flotante con doble precisión, en tu caso parece que quieres construir una IP y no necesitas los decimales para nada, usa un tipo entero (char, short, int...).
  • Usas algoritmos incorrectos: Si pretendes generar números entre 0 y 255 el resultado de rand deberías operarlo contra 256, si operas contra 255 obtendrás números entre 0 y 254.

Teniendo en cuenta todo lo anterior, y programando en C++ como es debido, el siguiente código debería cumplir con tus requerimientos:

#include <iostream>
#include <random>
#include <algorithm>

int main()
{
    // Generacion de numeros pseudo-aleatorios
    std::random_device dispositivo;
    std::mt19937 generador(dispositivo());
    std::uniform_int_distribution<int> distribucion(0, 255);

    // Arreglos
    constexpr std::size_t tamanyo = 10;
    int n1[tamanyo];
    int n2[tamanyo];
    int n3[tamanyo];
    int n4[tamanyo]; 

    // Generar numeros
    auto rnd = [&distribucion, &generador]{ return distribucion(generador); };
    std::generate_n(n1, tamanyo, rnd);
    std::generate_n(n2, tamanyo, rnd);
    std::generate_n(n3, tamanyo, rnd);
    std::generate_n(n4, tamanyo, rnd);

    // Generar cadenas
    std::string IPs[tamanyo];
    for (int indice = 0; indice != tamanyo; ++indice)
    {
        IPs[indice] = std::to_string(n1[indice]) + '.' +
                std::to_string(n2[indice]) + '.' +
                std::to_string(n3[indice]) + '.' +
                std::to_string(n3[indice]);
    }

    // Mostrar
    for (const auto &IP : IPs)
    {
        std::cout << IP << '\n';
    }

    return 0;
}

Puedes verlo funcionando en Try it online!.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • gracias por contestar mi pregunta,el objetivo del código es crear 4 arreglos donde cada una de la posiciones de los 4 arreglos tenga un entero aleatorio entre "0"y"255" lo cual esta en el primer for del código como puedes ver ,luego intentar "concatenar" el primer arreglo con un".",luego esa primera parte con la segunda que es igual pero con el segundo arreglo y así asta llegar al la cuarta parte ,y todo eso guardarlo en un arreglo de tipo string y mostrarlo por pantalla , ¿si tu anterior respuesta cumple o puede realizar este objetivo? agradezco tu respuesta – Gregorio Varon Rengifo Jun 23 '21 at 02:05
  • @GregorioVaronRengifo si tu objetivo es el que describes, has redactado mal la pregunta y el código. Parece que estás describiendo un [Problema XY](https://es.wikipedia.org/wiki/Problema_XY). – PaperBirdMaster Jun 23 '21 at 07:12
  • gracias ,no sabia que estaba usando tan mal c++ ,tengo una pequeña duda ¿se puede hacer con numeros aleatorios y no pseudoaleatorios ? – Gregorio Varon Rengifo Jun 24 '21 at 02:37
  • ¿ puedo usar el using namespace y quitar el std: :? para mi es mas comodo – Gregorio Varon Rengifo Jun 24 '21 at 02:39
  • @GregorioVaronRengifo los ordenadores no son capaces de generar números aleatorios, toda generación de números aleatorios consiste en aplicar una fórmula matemática; por eso se llaman pseudo-aleatorios. Puedes usar el `using namespace std`, pero hazlo siempre en el ámbito lo más pequeño posible y **jamás** lo hagas en un archivo de cabecera. – PaperBirdMaster Jun 25 '21 at 08:32
  • gracias, y aclare mis dudas – Gregorio Varon Rengifo Jun 26 '21 at 01:30