Warum schließt sich das Programm bei der Eingabe von : oder / ?



  • Ich habe ein Konsolenprogramm in C++ geschrieben, welches Gleichungen berechnen kann. Ich hab es fertig gestellt und es funktioniert auch alles, bis auf geteilt rechnen. Sobald ich bei dem cin-Befehl ein / oder ein : eingebe, beendet sich das Programm von selbst, ohne dass weiterer Code ausgeführt. Jetzt meine Frage warum es das tut? Stört das irgendwie den Combiler ode was? Schonmal danke für Antworten!

    Hier mein Code:

    #include <iostream>
    #include <stdlib.h>
    #include <string>

    using namespace std;
    int length = 32;

    int getDelimiter(string input){
    int posA = input.find("+");
    int posS = input.find("-");
    int posM = input.find("*");
    int posD = input.find(":");
    int delimiter;

    if(posA == -1){
    posA = 100;
    }
    if(posS == -1){
    posS = 100;
    }
    if(posM == -1){
    posM = 100;
    }
    if(posD == -1){
    posD = 100;
    }

    if(posA < posS && posA < posM && posA < posD){
    delimiter = posA;
    }
    else if(posS < posA && posS < posM && posS < posD){
    delimiter = posS;
    }
    else if(posM < posA && posM < posS && posM < posD){
    delimiter = posM;
    }
    else if(posD < posA && posD < posM && posD < posS){
    delimiter = posS;
    }
    else{
    delimiter = 0;
    }

    return delimiter;
    }

    int main(void){
    string input;
    string w;
    int delPos;
    int firstPos = 0;
    char operators[length];
    long long int numbers[length];
    float ergebnis = 0.0;

    //Arrays vordeklarieren
    for(int i = 0; i < length; i++){
    numbers[i] = 0;
    operators[i] = 'e';
    }

    //Eingabe abfragen
    cout << "Geben Sie eine Gleichung ein:" << endl;
    cin >> input;

    //Position des Ersten Operators abfragen
    delPos = getDelimiter(input);

    //Falls es nur eine Zahl gibt nur diese ausgeben;
    if(delPos == 0){
    numbers[0] = atoi((input.substr(0)).c_str());
    }
    //Zahlen und Operatoren filtern
    else{
    for(int i = 0; input != ""; i++){
    //Herausfinden, ob es die letzte Zahl ist,...
    if(delPos == 0){
    w = input.substr(firstPos);
    numbers[i] = atoi(w.c_str());
    input = "";
    }
    //...Ansonsten nochmal in die Schleife mit neuen Werten
    else{
    w = input.substr(firstPos, delPos);
    numbers[i] = atoi(w.c_str());
    w = input.substr(delPos, (delPos + 1));
    operators[i] = w[0];
    input = input.substr((delPos+1));
    }
    //Herausfinden ob es noch einen Operator gibt, wenn true ihn speichern
    delPos = getDelimiter(input);
    }
    }

    ergebnis = numbers[0];
    //Alle Werte zusammen rechnen
    int nIndex = 1, oIndex = 0;
    while(numbers[nIndex] != 0){
    //Operator herausfinden und berechnen
    switch(operators[oIndex]){
    case '+':
    ergebnis += numbers[nIndex];
    oIndex++;
    break;
    case '-':
    ergebnis -= numbers[nIndex];
    oIndex++;
    break;
    case '*':
    ergebnis *= numbers[nIndex];
    oIndex++;
    break;
    case ':':
    ergebnis /= numbers[nIndex];
    oIndex++;
    break;
    default:
    break;
    }
    nIndex++;
    }

    /*for(int i = 0; i < length; i++){
    cout<<numbers[i]<<", ";
    }
    cout<<endl;
    for(int i = 0; i < length; i++){
    cout<<operators[i]<<", ";
    } */

    //Ergebnis ausgeben
    cout << endl << "Das Ergebnis lautet: " << ergebnis << endl;

    return 0;
    }



  • Kurz gedebuggt.

    Wenn du einen : eingibst, dann ist delPos=100 und input.substr(delPos, (delPos + 1)) stürzt ab.



  • Kurz angeschaut.

    if(posA < posS && posA < posM && posA < posD){ 
    delimiter = posA; 
    } 
    else if(posS < posA && posS < posM && posS < posD){ 
    delimiter = posS; 
    } 
    else if(posM < posA && posM < posS && posM < posD){ 
    delimiter = posM; 
    } 
    else if(posD < posA && posD < posM && posD < posS){ 
    delimiter = posS; 
    }
    

    Schau mal delimeter=, in dem Muster passt etwas nicht (die letzte Zuweisung).



  • Sehr gut, vielen Dank. Jetzt funktioniert's 🙂


Log in to reply