Hilfe zur Strings



  • So wir nehmen in der Schule C++ und Strings

    Dabei ist die Frage aufgetretten wie mann dieses Programm (String)Auch mit negativen Zahlen eingeben kann.

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <cmath>
    
    using namespace std;
    
    int stringtonumber (string zeichenkette)
    {
    	int zahl =0;
    	unsigned stringlaenge;
    	stringlaenge = zeichenkette.length();
    	int	z = 0;							int i = 0;	
           	char c;	
    
    	while ( i < stringlaenge )
    		{
    			c = zeichenkette [ stringlaenge -1 -i ];
    			if ( 48 <= c && c <= 57 )
    			{
    				z = c - 48;
    				zahl = zahl + z * pow(10.0, i);
    				i = i + 1;
    			}
    
    			else
    			{
    				cout << "Ihre Eingabe ist keine Zahl!\n";
    				zahl = 0;
    				i = stringlaenge;											
    			}
    		}
    		return (zahl);
    }
    
    int main(void)
    {
    	bool neue_eingabe;
    
    	do
    	{
    		cout <<	"Geben Sie eine beliebige Zahl oder \"x\" zum beenden ein: ";
    		string eingabe;
    		cin >>	eingabe;
    
    		if(eingabe [0] == 'x' || eingabe[0] == 'X')
    		{
    			neue_eingabe = false;
    		}
    		else
    		{
    			neue_eingabe = true;
    			cout << "Die Zahl lautet: " << stringtonumber(eingabe) << "\n";
    		}
    
    	}
    
     	while(neue_eingabe);
    	return 0;
    
    }
    

    ich bin der meinung Dass man aus dem unsigned stringlaenge; eine signed stringlaenge; machen muss ??? aber es funktioniert nicht so richtig ; :p

    Vielen Dank für die Hilfe



  • Tjoa ich würd einfach überprüfen, ob das erste Zeichen im String ein '-' ist:

    #include <iostream>
    #include <string>
    #include <cctype> //fuer isdigit
    
    int to_int(std::string s)
    {
        int value = 0;
        for(unsigned i = 0; i < s.length(); ++i)
        {
            if(std::isdigit(s[i])) 
                value = (value * 10) + (s[i] - '0');
        }
        if(s[0] == '-') return -value; //tadaa
        return value;
    }
    
    int main()
    {
        std::cout << to_int("123") << "\n"
                  << to_int("-123");
        return 0;
    }
    


  • Du kannst doch z.B. einfach das erste Zeichen in der Zeichenkette überprüfen, ob es das '-' Zeichen ist. Falls ja setzt du eine Variable bool negativ = true, falls nein setzt du sie false. Am Ende der Funktion schaust du dann, ob negativ==true. Falls ja multiplizierst die Zahl mit -1.



  • Gugelmoser schrieb:

    Du kannst doch z.B. einfach das erste Zeichen in der Zeichenkette überprüfen, ob es das '-' Zeichen ist. Falls ja setzt du eine Variable bool negativ = true, falls nein setzt du sie false. Am Ende der Funktion schaust du dann, ob negativ==true. Falls ja multiplizierst die Zahl mit -1.

    Wie wurde dann der Queltex Ausehen ...also intregiert in meinen ???



  • Hab ich dir doch gezeigt?!

    Ich find deine Variante eher unschön, viel zu viel für so wenig.
    Aber wenn du willst:

    statt

    return (zahl);
    

    einfach

    if(zeichenkette[0] == '-')) return -zahl;
    return zahl;
    

    Oder von mir aus auch:

    int stringtonumber (string zeichenkette)
    {
        bool negativ = (zeichenkette[0] == '-');
        //...
        if(negativ) return -zahl;
        return zahl;
    }
    

    Außerdem funktioniert deine Variante nichtmal richtig, sie gibt falsche Werte aus. Ich schätze mal es liegt an der Konvertierung vom Ergebnis von pow(10, i): diese Funktion gibt einen double zurück, zb. 5.99999999 statt 6. Bei der impliziten Typkonvertierung nach int (da zahl vom Typ int ist) geht bei größeren Zahlen so Information verloren, da int(5.999999) = 5 ist (die Nachkommastellen werden einfach abgeschnitten).


Anmelden zum Antworten