2 Questão: No momento, estou tentando salvar um conjunto de inteiros em uma matriz int, redefinindo a cadeia em números e, em seguida, armazenando-a na matriz

pergunta criada em Wed, May 8, 2019 12:00 AM

Estou tentando converter texto /números de entrada (string), que incluirá todos os caracteres, mas quero separar os números dos caracteres e armazená-los em uma matriz de inteiros, uma vez que eles sejam convertidos de uma string.

Eu acredito que o problema é onde a string está convertendo para um número inteiro pelo uso de stoi(), mas não consigo identificar o problema.

Atualmente, o código aceita qualquer entrada e a transforma em uma string, a string é então marcada caractere por caractere e todos os números sem separação por vírgula ou espaço são somados, uma vírgula ou espaço, ou qualquer outro caractere separa o número, o número como um todo é adicionado à matriz e continua a verificar a seqüência de caracteres para mais números.

Alguma ideia? Exemplo de entrada 1: 12, 13, 15     Exemplo de entrada2: 12 13 15         Exemplo de entrada 3: 12ab13cd15ef

Resultado na matriz de inteiros: 0 [12] 1 [13] 2 [15] Esses números serão usados ​​na ordem específica, usando os números dentro da 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 Respostas                              2                         

Eu vejo alguns problemas com o seu código.

  • Antes do C ++ 11, while (datainput[n]) tem comportamento indefinido quando o n atinge o final da string.

  • A maneira como você está verificando dígitos numéricos pode ser muito simplificada usando std::isdigit() ou até mesmo uma simples verificação de intervalo usando os operadores >= e <=.

  • Você não está contabilizando corretamente os números separados por outros caracteres ou quando o último número da string está no final da string.

  • A declaração c >> myray[raycount]; precisa ser alterada para myray[raycount] = c;. E você não está quebrando o seu loop se raycount atinge a capacidade máxima de myray[].

  • Você não está redefinindo str3 de volta para uma string em branco após convertê-lo com std::stoi(). Você continua anexando novos dígitos ao final dos dígitos anteriores sem quebra entre os números.

Com isso dito, tente algo mais assim:

#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;
}

Demonstração ao vivo

Alternativamente:

#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;
}

Demonstração ao vivo

    
0
2019-05-08 21: 43: 34Z
  1. Obrigado pela sua contribuição! Apliquei algumas das mudanças que você sugeriu e são passos na direção certa. Também aprecio muito os outros métodos que tornarão o código mais fácil. Redefinir as cadeias de caracteres e o número inteiro pareceu corrigir o problema de empilhamento, mas ainda estou presa em obter todos os números empilhados na matriz e a conversão da cadeia em um número. Eu vou navegar pelo código que você postou e ver se eu ainda posso resolver o meu problema. : -)
    2019-05-08 20: 06: 06Z
  2. @ Daniel seria útil se você pudesse editar sua pergunta para mostrar a entrada real que você está digitando, e qual deve ser o resultado esperado.
    2019-05-08 20: 09: 37Z
  3. Eu adicionei 3 exemplos, que devem produzir o mesmo resultado.
    2019-05-08 20: 39: 55Z
  4. @ Daniel Atualizei minha resposta. Houve um erro no meu primeiro exemplo, que eu corrigi.
    2019-05-08 21: 38: 44Z

Então, você deseja segregar números e caracteres em matrizes diferentes. Em if block, você está checando os caracteres, então, eu suspeito que stoi () não funcionaria. Melhor typecast para um inteiro.

int temp[10];

if (datainput[n] == ('0') || ...) {
            temp[n] = int(datainput[n]);
        }

Este way seu array temporário conteria os números.

    
- 1
2019-05-08 16: 34: 59Z
  1. Eu ficaria muito grato se você me disser por que esta resposta está sendo rejeitada? Obrigado.
    2019-05-13 08: 34: 19Z
fonte colocada Aqui