2 Pytanie: Obecnie próbuję zapisać zestaw liczb całkowitych w tablicy int, poprzez ponowne zdefiniowanie ciągu na liczby, a następnie zapisanie go w tablicy

pytanie utworzone w Wed, May 8, 2019 12:00 AM

Próbuję przekonwertować tekst /cyfry wejściowe (ciąg znaków), które będą zawierać dowolne znaki, ale chcę oddzielić liczby od znaków i zapisać je w tablicy liczb całkowitych, gdy zostaną one przekonwertowane z ciągu znaków. p>

Sądzę, że problem polega na tym, że ciąg jest konwertowany na liczbę całkowitą przy użyciu stoi(), ale nie wydaje mi się, aby wykrył problem.

Obecnie kod akceptuje wszelkie dane wejściowe i zamienia je w ciąg znaków, a następnie ciąg znaków jest sprawdzany znak po znaku, a wszystkie liczby bez separacji z przecinkiem lub spacją są dodawane, raz przecinek lub spacja, lub dowolny inny znak oddziela liczbę, liczba jako całość jest dodawana do tablicy, a następnie kontynuuje sprawdzanie ciągu, aby uzyskać więcej liczb.

Jakieś pomysły? Przykład wejścia1: 12, 13, 15     Przykład wejścia2: 12 13 15         Input3 Przykład: 12ab13cd15ef

Wynik w tablicy liczb całkowitych: 0 [12] 1 [13] 2 [15] Liczby te będą używane w określonej kolejności, przy użyciu liczb w tablicy.

#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 odpowiedzi                              2                         

Widzę kilka problemów z twoim kodem.

  • Przed C ++ 11 while (datainput[n]) ma niezdefiniowane zachowanie , gdy n osiągnie koniec łańcucha.

  • Sposób sprawdzania cyfr numerycznych można znacznie uprościć za pomocą std::isdigit() lub nawet po prostu sprawdzić zakres za pomocą operatorów >= i <=.

  • Nie poprawnie rozliczasz liczby oddzielone innymi znakami lub gdy ostatni numer w ciągu znajduje się na samym końcu łańcucha.

  • Instrukcja c >> myray[raycount]; musi zostać zmieniona na myray[raycount] = c;. I nie łamiesz pętli, jeśli raycount osiągnie maksymalną pojemność myray[].

  • Nie przywracasz str3 z powrotem do pustego łańcucha po przekonwertowaniu go na std::stoi(). Po prostu dodajesz nowe cyfry na końcu poprzednich cyfr bez przerywania między liczbami.

Mając to na uwadze, spróbuj czegoś takiego:

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

Demo na żywo

Alternatywnie:

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

Demo na żywo

    
0
2019-05-08 21: 43: 34Z
  1. Dziękuję za Twój wkład! Zastosowałem kilka zmian, które zaproponowałeś, i są to kroki we właściwym kierunku. Doceniam również inne metody, które ułatwią kod. Zresetowanie ciągów znaków i liczb całkowitych zdawało się rozwiązywać problem z układaniem, ale wciąż tkwiłem w ciągłym gromadzeniu wszystkich liczb w tablicy i konwersji ciągu na liczbę. Przejrzę kod, który opublikowałem i zobaczę, czy mogę rozwiązać mój problem. :-)
    2019-05-08 20: 06: 06Z
  2. @ Daniel byłoby pomocne, gdybyś edytował swoje pytanie, aby pokazać rzeczywiste dane, które wpisujesz i jak powinien wyglądać oczekiwany wynik.
    2019-05-08 20: 09: 37Z
  3. Dodałem 3 przykłady, które powinny dać ten sam rezultat.
    2019-05-08 20: 39: 55Z
  4. @ Daniel Zaktualizowałem swoją odpowiedź. W moim pierwszym przykładzie wystąpił błąd, który naprawiłem.
    2019-05-08 21: 38: 44Z

Chcesz więc oddzielić liczby i znaki od różnych tablic. W if block sprawdzasz znaki, więc podejrzewam, że sto () nie będzie działać. Lepiej wpisz go do liczby całkowitej.

int temp[10];

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

To way twoja tablica temp będzie zawierać liczby.

    
- 1
2019-05-08 16: 34: 59Z
  1. Byłbym wdzięczny, gdybyś mi powiedział, dlaczego ta odpowiedź została odrzucona? Dzięki.
    2019-05-13 08: 34: 19Z
źródło umieszczone tutaj