[C++] Kommandozeilen Rechner | Typenkonvertierung char2string

Tim C.

Erfahrenes Mitglied
Einen wunderschönen 2. Advents-Abend.

Ich bin langsam am verzeifeln. Nachdem ich nun eine Woche lang in meinem C++ Buch gelesen habe und dachte, ich hätte die Theorie dahinter verstanden, wollte ich mich mal an ein wirklich einfaches Beispiel, fern ab von jedem Beispiel in Buch oder Internet wagen.
Es soll ein total schlichter Kommandozeilen Rechner sein, der nur die 4 Grundrechenarten kann.
Eingegeben werden soll die Rechnung ganz einfach als 234+43 zum Beispiel.
Ok also habe ich mich freudig ans Werk gemacht.
Code:
#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main()
{
  string sInput;
  int iPosition,iNumber1,iNumber2;
  string sRechenzeichen = "+-/*";
Die Header sollten ja klar sein. Die Variablen Deklaration habe ich mir folgendermaßen gedacht. sInput ist die eingegebene Rechnung, iPosition wird später gebraucht, um die Position des Rechezeichens zurückzugeben und iNumber1 und iNumbe2 sollen die zwei Zahlen enthalten, mit denen gerechnet wird.
Dann geht es im Code folgendermaßen weiter
Code:
cout << "Bitte geben Sie die Rechnung ein: ";
cin >> sInput;
cout << endl;
Alles soweit kein Problem. Doch jetzt folgt der Teil an dem ich verzweifle.
Im folgenden will ich zum einen die Funktion strcspn() nutzen um die Position des Rechenzeichens zu ermitteln. Der Haken, die Funktion erwartet als Parameter Werte vom Typ char.
Im folgenden wollte ich jedoch, die Methode substr() der Klasse string nutzen um dann die zwei Zahlen in getrennte Variablen zu packen. Das ist ja rein theoretisch mit der Information über die Position des Rechenzeichens auch kein Problem, aber wie gesagt:
substr() kann ich nur nutzen, wenn die Variable vom Typ string ist aber strcspn() erwartet chars als Übergabewerte. Ich bin echt am verzwefeln und habe auf Grund der nur dezentral vorhandenen Dokumentationen echte Probleme.
Nutze Dev-C++ zum entwickeln und hier nochmal der komplette Code.
Code:
#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main()
{
  string sInput;
  int iPosition,iNumber1,iNumber2;
  string sRechenzeichen = "+-/*";
  
  cout << "Bitte geben Sie die Rechnung ein: ";
  cin >> sInput;  
  cout << endl;

  //Ab hier sind das ganze Test, es krampfhaft über Zeiger oder Ähnliches zu versuchen
  //sind aber alle fehlgeschlagen.
  char * cpInput;
  cpInput = sInput;
  char * cpRechenzeichen;
  cpRechenzeichen = sRechenzeichen;
  iPosition = strcspn(cpInput,cpRechenzeichen);
  cout << iPosition << endl;
  
  string sTest = cInput;
  iNumber1 = atoi(sTest.substr(0,iPosition)); //Hier wollte ich dann den Substring in eine Variable vom typ Int umwandeln.
  cout << iNumber1;
  
  system("PAUSE");	
}
 
size_t strcspn ( const char * string1, const char * string2 );

die Funktion erwartet überhaupt nicht Char als Parameter sondern Zieger auf chars (hier sogar const char* ) ... Ein Zeiger auf chars (mit Null Terminierung) ist ein String, bzw. wird so verwendet in C.
Für Debug Zwecke würde ich das eingelesene sInput ausgeben. SChau einmal ob er dir die Zeile richtig einliest. (eventuell ReadLine verwenden).
Um den Zeiger auf den String zu erhlten kann man die Methode string::c_str verwenden.Normalerweise müsste die Transformation auch über ein cast möglich sein .
(char *)StringName
 
So ich hab mal zum Spaß schnell einen kleinen Rechner geschrieben, is net sehr ausgereift, aber dazu hatte ich keine Lust
Hier mal der Code, denke das könnte dir weiterhelfen:
Code:
#include <iostream>
#include <stdio.h>

using namespace std;


double Dividiere(int a, int b)
{
	if(b)
		return (double)a/(double)b;
	else
	{
		cout << "Division durch 0 nicht zulässig!" << endl;
	}
	return 0;
}
int Multipliziere(int a, int b){return a*b;}
int Subtrahiere(int a, int b){return a-b;}
int Addiere(int a, int b){return a+b;}

int main(int argc, char** argv)
{
	char cInput[100];
	string sInput;

	cout << "Bitte Rechnung eingeben: ";
	cin >> cInput;
	cout << endl;

	sInput = cInput;

	string sRechenzeichen = "+-*/";

	int iPos=0;		

	for(int i=0; i<sRechenzeichen.length(); i++)
	{
		iPos = sInput.find((char)sRechenzeichen[i]);
		// ist die Positon > 0 und kleiner als npos (maximal), dann haben wir ein Rechenzeichen gefunden
		if(iPos && iPos!=string::npos)
		{
			char cOperator;
			cOperator = sInput[iPos];
			string sLeft, sRight;
			sLeft = sInput.substr(0, iPos);
			sRight = sInput.substr(iPos+1);
			int a=0;
			int b=0;
			a = atoi(sLeft.data());
			b = atoi(sRight.data());

			switch(cOperator)
			{
				case '+':
					cout << "Ergebnis= " << Addiere(a,b) << endl;
					break;
				case '-':
					cout << "Ergebnis= " << Subtrahiere(a,b) << endl;
					break;
				case '*':
					cout << "Ergebnis= " << Multipliziere(a,b) << endl;
					break;
				case '/':
					cout << "Ergebnis= " << Dividiere(a,b) << endl;
					break;
			}
		}
	}
	system("PAUSE");
	return 0;
}
 
Original geschrieben von Tim Comanns

Im folgenden wollte ich jedoch, die Methode substr() der Klasse string nutzen um dann die zwei Zahlen in getrennte Variablen zu packen. Das ist ja rein theoretisch mit der Information über die Position des Rechenzeichens auch kein Problem, aber wie gesagt:
substr() kann ich nur nutzen, wenn die Variable vom Typ string ist aber strcspn() erwartet chars als Übergabewerte.

du kannst die funktion c_str() der c++ string klasse verwenden, die gibt einen pointer auf einen regulären C string zurück
 
Danke Daniel, das hat mich zumindest von der Idee her etwas weitergebracht, allerdings ist die if-Abfrage nie wahr, da iPos aus irgendeinem Grunde stets -1 ist.
 
Original geschrieben von Daniel Toplak
Also ich habe das getestet und bei mir gings. *hm*
Komisch, naja sollte ja keine Musterlösung sein, sondern nur ein kleines Beispiel.

Gruß Homer
Ok werde dann heute Abend evtl. nochmal den anderen Weg gehen. Code komplett kopieren und dann anpassen und nicht Code lesen, versuchen zu verstehen und selber bauen und immer wieder abgleiche, obwohl ja letzteres eigentlich besser wäre ... ;)

Naja irgendwie werd ich das Kindchen schon schaukeln.
 
ersuchen zu verstehen und selber bauen und immer wieder abgleiche, obwohl ja letzteres eigentlich besser wäre ...
Das wäre in der Tat das Bessere.
Ich weiß ich habe den Code nur mal so schnell dahingetippt. Wo gibt es denn Verständnisproblem?
Evtl. Kann ich dir da helfen.
Wäre ja armselig wenn ich mein eigenen Code nicht verstehen würde :-)

Gruß Homer
 
Zurück