2 Pregunta: Actualmente estoy intentando guardar un conjunto de enteros en una matriz int, redefiniendo la cadena en números y luego almacenarla en la matriz

pregunta creada en Wed, May 8, 2019 12:00 AM

Estoy tratando de convertir texto /números de entrada (cadena), que incluirá cualquier carácter, pero quiero separar los números de los caracteres y almacenarlos en una matriz entera, una vez que se convierte de una cadena.

Creo que el problema es que la cadena se está convirtiendo en un entero mediante el uso de stoi(), pero parece que no puedo detectar el problema.

Actualmente, el código acepta cualquier entrada y la convierte en una cadena, la cadena se comprueba carácter por carácter y todos los números sin separación con coma o espacio se agregan juntos, una vez una coma o espacio, o cualquier otro carácter separa el número, el número completo se agrega a la matriz y luego continúa revisando la cadena para ver más números.

¿Alguna idea? Ejemplo de entrada 1: 12, 13, 15     Ejemplo de entrada 2: 12 13 15         Ejemplo de entrada 3: 12ab13cd15ef

Resultado en una matriz de enteros: 0 [12] 1 [13] 2 [15] Estos números se utilizarán en el orden específico, utilizando los números dentro de la matriz.

#include<iostream>
#include<string>
#include <sstream>
using namespace std;

int main()
{
    string datainput, str1, str3;
    cin >> datainput;
    int n = 0, raycount = 0, c;
    int myray[10];
    while (datainput[n])
    {
        if (datainput[n] == ('0') || datainput[n] == ('1') || datainput[n] == ('2') || datainput[n] == ('3') || datainput[n] == ('4') ||
            datainput[n] == ('5') || datainput[n] == ('6') || datainput[n] == ('7') || datainput[n] == ('8') || datainput[n] == ('9'))
        {
            str1 = datainput[n];
            str3 += str1;
        }
        else
        {
            c= stoi(str3);
            c >> myray[raycount];
            raycount++;
        }
        n++;
    }
    cout << myray[0] << endl;
    cout << myray[1] << endl;
    cout << myray[2] << endl;
    cout << myray[3] << endl;
    system("pause");
    return 0;
}
    
0
2 Respuestas                              2                         

Veo bastantes problemas con tu código.

  • Antes de C ++ 11, while (datainput[n]) tiene comportamiento indefinido una vez que n llega al final de la cadena.

  • La forma en que verifica los dígitos numéricos se puede simplificar enormemente utilizando std::isdigit(), o incluso simplemente una verificación de rango utilizando los operadores >= y 060035099111110101035062.

  • No estás contabilizando correctamente los números que están separados por otros caracteres, o cuando el último número en la cadena está al final de la cadena.

  • La declaración <= debe cambiarse a c >> myray[raycount]; en su lugar. Y no está rompiendo su ciclo si myray[raycount] = c; alcanza la capacidad máxima de raycount.

  • No está restableciendo de nuevo myray[] a una cadena en blanco después de convertirla con 060035099111110101035062. Simplemente agregue nuevos dígitos al final de los dígitos anteriores sin interrupción entre los números.

Dicho esto, intente algo más como esto en su lugar:

str3

Demostración en vivo

Alternativamente:

std::stoi()

Demostración en vivo

    
0
2019-05-08 21: 43: 34Z
  1. ¡Gracias por tu aporte! He aplicado algunos de los cambios que sugirió, y son pasos en la dirección correcta. También apreciamos mucho los otros métodos que harán el código más fácil. Restablecer las cadenas y el número entero pareció solucionar el problema de apilamiento, pero todavía estoy atascado al obtener todos los números apilados en la matriz y la conversión de la cadena a un número. Examinaré el código que publicaste y veré si puedo resolver mi problema. :-)
    2019-05-08 20: 06: 06Z
  2. @ Daniel sería útil si editaras tu pregunta para mostrar la entrada real que estás escribiendo, y cómo debería ser el resultado esperado.
    2019-05-08 20: 09: 37Z
  3. He agregado 3 ejemplos, que deberían producir el mismo resultado.
    2019-05-08 20: 39: 55Z
  4. @ Daniel Actualicé mi respuesta. Hubo un error en mi primer ejemplo, que he corregido.
    2019-05-08 21: 38: 44Z

Por lo tanto, desea segregar números y caracteres en diferentes arreglos. En el bloque if, estás buscando caracteres, así que sospecho que stoi () no funcionaría. Mejor enciéndalo en un entero.

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string datainput, str3;
    cin >> datainput;

    int myray[10];
    int raycount = 0;

    bool gettingDigits = false;

    for (int n = 0; n < datainput.size(); ++n)
    {
        char ch = datainput[n];

        //if (isdigit(ch))
        if (ch >= '0' && ch <= '9')
        {
            if (!gettingDigits)
            {
                str3 = "";
                gettingDigits = true;
            }

            str3 += ch;
        }
        else
        {
            if (gettingDigits)
            {
                myray[raycount] = stoi(str3);
                raycount++;
                str3 = "";
                gettingDigits = false;
                if (raycount == 10) break;
            }
        }
    }

    if (gettingDigits && (raycount < 10))
    {
        myray[raycount] = stoi(str3);
        raycount++;
    }

    for (int n = 0; n < raycount; ++n)
        cout << myray[n] << endl;

    system("pause");
    return 0;
}

Este waTu matriz temporal contendría los números.

    
- 1
2019-05-08 16: 34: 59Z
  1. Le agradecería que me dijera por qué esta respuesta es votada a la baja? Gracias.
    2019-05-13 08: 34: 19Z
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string datainput, str3;
    cin >> datainput;

    int myray[10];
    int raycount = 0;

    string::size_type start = datainput.find_first_of("0123456789");
    string::size_type end;

    while (start != string::npos)
    {
        end = datainput.find_first_not_of("0123456789", start+1);
        if (end == string::npos)
        {
            str3 = datainput.substr(start);
            myray[raycount] = stoi(str3);
            raycount++;
            break;
        }

        str3 = datainput.substr(start, end-start);
        myray[raycount] = stoi(str3);
        raycount++;
        if (raycount == 10) break;

        start = datainput.find_first_of("0123456789", end+1);
    }

    for (int n = 0; n < raycount; ++n)
        cout << myray[n] << endl;

    system("pause");
    return 0;
}
fuente colocada aquí