C++ IOStream Problem

03/08/2010 22:07 Xereon#1
Ok nach einer halben Stunde "WTF" und "Bücher hastig rausgraben" bin ich nun langsam am verzweifeln.

Code:
#include <windows.h>
#include <iostream>

using namespace std;

int main(){
	char* text;
	char* caption;
	cin >> text >> caption;
	MessageBox(NULL,text,caption,MB_OK);
}
Das ist mein Code, der eine dynamische MsgBox erstellen soll. Das Problem liegt an der IOStream. Sobal die zweite Variable per CIN gesetzt wird, nimmt die Variable "text" auch den gleichen Wert an.
03/08/2010 22:29 flo8464#2
Deine Zeiger zeigen auf keinen Speicher!
Nimm die Stringklasse (std::string).
03/08/2010 22:31 djpromo#3
Quote:
Originally Posted by flo8464 View Post
Deine Zeiger zeigen auf keinen Speicher!
Nimm die Stringklasse (std::string).
string reicht , er hat ja std schon als namespace deklariert
03/08/2010 22:32 Shadow992#4
Quote:
Originally Posted by Xereon View Post
Ok nach einer halben Stunde "WTF" und "Bücher hastig rausgraben" bin ich nun langsam am verzweifeln.

Code:
#include <windows.h>
#include <iostream>

using namespace std;

int main(){
	char* text;
	char* caption;
	cin >> text >> caption;
	MessageBox(NULL,text,caption,MB_OK);
}
Das ist mein Code, der eine dynamische MsgBox erstellen soll. Das Problem liegt an der IOStream. Sobal die zweite Variable per CIN gesetzt wird, nimmt die Variable "text" auch den gleichen Wert an.
Da du die Aufgabe , wie mir scheint , mit C-Strings lösen willst , wäre das eine Möglichkeit das Problem zu lösen .
Code:
int main()
{
	char text[1024];
	char caption[1024];
	scanf("%s%s",text,caption);
	MessageBox(NULL,text,caption,MB_OK);
}
03/08/2010 23:04 flo8464#5
Quote:
Originally Posted by djpromo View Post
string reicht , er hat ja std schon als namespace deklariert
Ich wollte ihn darauf hinweisen, dass ich die Klasse 'string' aus dem Namespace 'std' meine. Gibt ja mehr als eine Klasse zum Wrappen von Strings ;)
03/09/2010 07:40 Xereon#6
Danke für eure Antworten, doch als ich gestern mich zu Bett legte kam mir die Antwort von selber wie eine Granate. Ich habe vergessen, den Pointer auf ein char Array zeigen zulassen und so hat er durch die Zuweisung cin>>text bzw cin>>caption auf den Inputstream an sich gezeigt.

Jetzt geht es:

Code:
#include <windows.h>
#include <iostream>

using namespace std;

int main(){
	char* text = new char[10];
	char* caption = new char[10];
	cin >> text >> caption;
	MessageBox(NULL,text,caption,MB_OK);
}
03/09/2010 15:52 flo8464#7
Darauf habe ich dich im ersten Post schon hingewiesen ;)

Auch wenn das nur ein Snippet ist, gib bitte den Speicher frei ! (Und zwar mit delete[] und nicht mit delete)
03/11/2010 21:34 Frezee#8
Quote:
Originally Posted by flo8464 View Post
Deine Zeiger zeigen auf keinen Speicher!
Nimm die Stringklasse (std::string).
Hmm ich lese ständig "Benutze std::string! Auf keinen Fall char*!"..
Was ist denn der Vorteil, wenn ich std::string benutze?? Meiner Erfahrung nach kommt man damit nicht weit, weil 99% der Funktionen nur char als Parameter akzeptiert..
Dann muss man die strings dann doch jedes mal aufs neue umwandeln, oder?
03/11/2010 21:41 voteban#9
c_str ftw!
03/11/2010 22:48 MrSm!th#10
Quote:
Originally Posted by Frezee View Post
Hmm ich lese ständig "Benutze std::string! Auf keinen Fall char*!"..
Was ist denn der Vorteil, wenn ich std::string benutze?? Meiner Erfahrung nach kommt man damit nicht weit, weil 99% der Funktionen nur char als Parameter akzeptiert..
Dann muss man die strings dann doch jedes mal aufs neue umwandeln, oder?
quatsch.

1. speicherallozierung und speicherbereinigung wird von der klasse übernommen
2. es gibt viele konvertierungsmöglichkeiten
3. für funktionen, die const char* brauchen gibts die methode c_str()
4. von welchen funktionen redest du bitte? o.O vielleicht von den C Std Funktionen, aber wohl nicht von den C++ Std Funktionen
5. selbst wenn fast immer const char* gebraucht werden würde, ist es zu umständlich immer const char* zu nutzen. denk mal einfach mal daran, dass du bei const char* immer auf die länge des buffers achten musst und damit auch nicht sehr flexibel bist
6. dann hast du anscheinend ziemlich schlechte erfahrungen, denn man kommt wie schon beschrieben, sehr wohl sehr weit, auch wenn nur const char* akzeptiert wird; wie gesagt, es ist einfach sicherer und komfortabler
7. char* schon mal gar nicht, wie gesagt const char* wird häufig akzeptiert, aber nicht in 99%
03/12/2010 14:00 flo8464#11
Quote:
Originally Posted by Frezee View Post
Hmm ich lese ständig "Benutze std::string! Auf keinen Fall char*!"..
Was ist denn der Vorteil, wenn ich std::string benutze?? Meiner Erfahrung nach kommt man damit nicht weit, weil 99% der Funktionen nur char als Parameter akzeptiert..
Dann muss man die strings dann doch jedes mal aufs neue umwandeln, oder?
std::string verwaltet intern ein char array, von daher ist das kein Problem.
03/12/2010 15:16 Tom94#12
Dennoch sind C-Strings effizienter...
Und auch nicht unbedingt komplizierter, wenn man sie ins kleinste Detail kennt.

Im Prinzip soltle das jeder selbst entscheiden, ist es kein Nachteil, c-Strings zu nehmen! ;)
03/12/2010 16:13 flo8464#13
Quote:
Originally Posted by Tom94 View Post
Dennoch sind C-Strings effizienter...
Und auch nicht unbedingt komplizierter, wenn man sie ins kleinste Detail kennt.

Im Prinzip soltle das jeder selbst entscheiden, ist es kein Nachteil, c-Strings zu nehmen! ;)
Ein dynamisch allozierter C-String ist nicht das kleinste bischen effizienter als ein std::string.
Wenn er auf dem Stack liegt, ja, aber der Unterschied ist minimal, es lohnt sich nicht.
03/12/2010 17:04 MrSm!th#14
Quote:
Originally Posted by Tom94 View Post
Dennoch sind C-Strings effizienter...
Und auch nicht unbedingt komplizierter, wenn man sie ins kleinste Detail kennt.

Im Prinzip soltle das jeder selbst entscheiden, ist es kein Nachteil, c-Strings zu nehmen! ;)
ähm niemand sagte komplizierter, sondern von der produktivität her ineffizienter ;)
außerdem ist std::string auf dauer gesehen und in großen codes sicherer^^
und wenn du unbedingt irgendeine eigene methode nutzen willst, kannste das ja auch in eine klasse stecken, aber mit einem puren c-string zu arbeiten, finde ich auf dauer zu nervig
03/13/2010 08:41 Tom94#15
Quote:
Originally Posted by MrSm!th View Post
ähm niemand sagte komplizierter, sondern von der produktivität her ineffizienter ;)
außerdem ist std::string auf dauer gesehen und in großen codes sicherer^^
und wenn du unbedingt irgendeine eigene methode nutzen willst, kannste das ja auch in eine klasse stecken, aber mit einem puren c-string zu arbeiten, finde ich auf dauer zu nervig
Ich sage ja nicht, dass C-Strings besser wären.
Wenn man jedoch ein erfahrener Programmierer ist, ist es absolut kein Problem auch reine C-Strings zu verwenden... :p