2 Frage: Ich versuche derzeit, einen Satz von Ganzzahlen in einem Int-Array zu speichern, indem ich einen String in Zahlen umdefiniere und ihn dann im Array speichere

Frage erstellt am Wed, May 8, 2019 12:00 AM

Ich versuche, Eingabetext /Zahlen (Zeichenfolge), die beliebige Zeichen enthalten, zu konvertieren, möchte jedoch die Zahlen von den Zeichen trennen und sie in einem ganzzahligen Array speichern, sobald sie aus einer Zeichenfolge konvertiert wurden.

p>

Ich glaube, das Problem liegt darin, dass die Zeichenfolge mithilfe von stoi() in eine Ganzzahl konvertiert wird, aber ich kann das Problem anscheinend nicht erkennen.

Derzeit akzeptiert der Code jede Eingabe und wandelt sie in eine Zeichenfolge um. Die Zeichenfolge wird dann zeichenweise überprüft, und alle durch Komma oder Leerzeichen getrennten Zahlen werden zusammenaddiert, einmal ein Komma oder Leerzeichen oder ein anderes Zeichen Trennt die Zahl, wird die gesamte Zahl zum Array hinzugefügt und überprüft die Zeichenfolge anschließend auf weitere Zahlen.

Irgendwelche Ideen? Eingabebeispiel 1: 12, 13, 15     Eingabebeispiel2: 12 13 15         Eingabebeispiel3: 12ab13cd15ef

Ergebnis in ganzzahligem Array: 0 [12] 1 [13] 2 [15] Diese Nummern werden in der angegebenen Reihenfolge verwendet, indem die Nummern innerhalb des Arrays verwendet werden.

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

Ich sehe einige Probleme mit Ihrem Code.

  • Vor C ++ 11 hat while (datainput[n]) undefiniertes Verhalten , sobald n das Ende der Zeichenfolge erreicht.

  • Mit den Operatoren 06003509901035062 oder auch nur mit den Operatoren std::isdigit() und >= kann die Art und Weise, wie Sie nach numerischen Ziffern suchen, erheblich vereinfacht werden.

  • Sie berücksichtigen Zahlen, die durch andere Zeichen getrennt sind, oder wenn sich die letzte Zahl in der Zeichenfolge ganz am Ende der Zeichenfolge befindet, nicht korrekt.

  • Die Anweisung <= muss stattdessen in c >> myray[raycount]; geändert werden. Und Sie unterbrechen nicht Ihre Schleife, wenn myray[raycount] = c; die maximale Kapazität von 0600350991100101035062 erreicht.

  • Sie setzen raycount nach der Konvertierung mit myray[] nicht wieder auf eine leere Zeichenfolge zurück. Sie fügen einfach weiterhin neue Ziffern an das Ende der vorherigen Ziffern an, ohne dass zwischen den Ziffern ein Zeilenumbruch erfolgt.

Versuchen Sie stattdessen etwas Ähnliches:

str3

Live-Demo

Alternativ:

std::stoi()

Live-Demo

    
0
2019-05-08 21: 43: 34Z
  1. Vielen Dank für Ihre Eingabe! Ich habe einige der von Ihnen vorgeschlagenen Änderungen vorgenommen, und es sind Schritte in die richtige Richtung. Schätzen Sie auch die anderen Methoden, die den Code einfacher machen. Das Zurücksetzen der Zeichenfolgen und der Ganzzahl schien das Stapelproblem zu beheben, aber ich bin immer noch fest entschlossen, alle Zahlen in das Array zu stapeln und die Zeichenfolge in eine Zahl umzuwandeln. Ich werde den von Ihnen veröffentlichten Code durchsuchen und prüfen, ob ich mein Problem weiter lösen kann. : -)
    2019-05-08 20: 06: 06Z
  2. @ Daniel Es wäre hilfreich, wenn Sie Ihre Frage so bearbeiten würden, dass die tatsächliche Eingabe angezeigt wird, die Sie eingeben, und wie das erwartete Ergebnis aussehen sollte.
    2019-05-08 20: 09: 37Z
  3. Ich habe 3 Beispiele hinzugefügt, die das gleiche Ergebnis liefern sollten.
    2019-05-08 20: 39: 55Z
  4. @ Daniel Ich habe meine Antwort aktualisiert. In meinem ersten Beispiel ist ein Fehler aufgetreten, den ich behoben habe.
    2019-05-08 21: 38: 44Z

Sie möchten also Zahlen und Zeichen in verschiedene Arrays unterteilen. Im if-Block suchen Sie nach Zeichen. Ich vermute, dass stoi () nicht funktioniert. Typisieren Sie es besser in eine Ganzzahl.

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

Das waIhr temporäres Array würde die Zahlen enthalten.

    
- 1
2019-05-08 16: 34: 59Z
  1. Ich wäre Ihnen dankbar, wenn Sie mir mitteilen würden, warum diese Antwort abgelehnt wurde. Vielen Dank.
    13.05.2019, 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;
}
Quelle platziert Hier