Wie zwei char* zusammenfügen...?
-
unsigned char *zeiger_a="Hausnummer", *zeiger_b; int nummer=12;
Wie kann ich die Variable Nummer an den Pointer *zeiger_a anhängen und an den Pointer *zeiger_b übergeben damit dort dann "Hausnummer12" enthalten ist?
Ich habe es geschafft zwei Pointer zusammenzufügen, aber Int anzuhängen treibt mich noch zur Verzweifelung...?
-
Die Initialisierung ist schon falsch (macht dein Compiler das?). Probier's mal so:
char zeiger_a[]="Hausnummer"; char zeiger_b[20]; int nummer=12; sprintf(zeiger_b,"%s %d",zeiger_a,nummer);
-
Ich möchte das aber mit einem Pointer machen und nicht mit einem Char-Array. Die Initialisierung passt schon so.
-
nimm
std::string
undstd::stringstream
.
-
Deswegen kannst du sprintf ja trotzdem verwenden. Du mußt natürlich genügend Speicher bereitstellen.
Die Initialisierung ist trotzdem falsch. Ein Stringliteral wie "Hausnummer" ist immer ein const char*. Da darfst du nichts hineinschreiben.
Warum verwendest du nicht std::string? Das macht alles viel einfacher.
-
ralf123 schrieb:
Ich möchte das aber mit einem Pointer machen und nicht mit einem Char-Array. Die Initialisierung passt schon so.
Nein, tut sie nicht. Der Name eines char-Arrays ohne []-Operator ist übrigens ein Pointer auf das erste Element, also ist deine Anforderung nur bedingt sinnvoll, nur mal so nebenbei. Mein Compiler jedenfalls sagt Folgendes:
Vc++ 9 schrieb:
c:\develop\testcon\testcon\main.cpp(25) : error C2440: 'Initialisierung': 'const char [11]' kann nicht in 'unsigned char *' konvertiert werden
Ist ja auch logisch, du versuchst, deiner 4 Byte Pointer-Variable ein konstantes char-Array zuzuweisen. Nochmal: kannst du das kompilieren? Will ich ja nicht ausschließen, käme mir aber komisch vor... zeiger_b deklarierst du, ohne Speicher zu reservieren. Das ist erstmal nur eine Pointer-Variable, die eine 4 Byte große Speicheradresse speichern kann. Da kannst du nicht den String, auf den zeiger_a zeigt, und den zweiten String speichern. Es ist ja kein Speicher reserviert worden! Du müsstest hier also dynamische Speicher per malloc/new allozieren. Wie gesagt, mein Beispiel funktioniert hervorragend, das kannst du ruhig so machen. Eine Alternative wäre, direkt std::string zu verwenden, ist deutlich einfacher, da hier auch praktische Operatoren überladen sind, die das zusammenfügen erleichtern. Aber du willst es ja mit Pointern machen...
-
Also hier erst mal den Hintergrund des Ganzen.
Ich habe in meiner Anwendung die serielle Schnittstelle eingebunden. Diese wird über eine Funktion...
void opencom(char *port, char *Settings)
... geöffnet. Mit dem Pointer *port wird z.B.: "COM1" und mit *Settings die Baudrate etc. übergeben.
Jetzt möchte ich in mein Formular die Auswahl der Portnummer integrieren mit der ich den Port auswählen kann. Die Portnummer hätte ich dann in einer Int-Variable. Der Funktion "opencom" sollte ich jetzt aber "COM1" übergeben. Momentan mache ich es halt sehr umständlich:if(ComboBox1->ItemIndex==0) {port="COM1";} if(ComboBox1->ItemIndex==1) {port="COM2";} if(ComboBox1->ItemIndex==2) {port="COM3";}
Ich möchte nicht unbedingt mit Pointern arbeiten, da die Funktion "opencom" nunmal so aufgebaut ist und auch nicht von mir stammt komme ich nicht drumherum.
Ich bin auch eher Programmiereinsteiger und eigne mir nach und nach das an was ich gerade für meine Anwendung brauche.@ _matze: Ja mein Compiler BCB6 macht das ohne Fehlermeldung
-
Kurz und Schmerzlos: strcat() aus <string.h>
STL string container aus <string> sind aber meist die bessere Wahl.typedef std::basic_string<char> String; String myString = "ein string container";
-
Bidius schrieb:
Kurz und Schmerzlos: strcat() aus <string.h>
STL string container aus <string> sind aber meist die bessere Wahl.typedef std::basic_string<char> String; String myString = "ein string container";
Bitte was?
Ersteinmal ist der Datentyp String schon ein Delphi Datentyp, damit wird der typedef wohl nicht kompiliert.
Zweitens gibt´s den typedef schon, das ist die Definiton für std::string. Wenn man schon basic_string<char> benutzen möchte, dann bitte mit der STL Typdefinition.
-
Interessant, dass der BCB das macht! Zu der Pointer-Geschichte: Wie ich erwähnte, arbeitest du ja auch mit Pointern, wenn du ein char-Array benutzt. Du könntest also problemlos Folgendes machen:
char sPort[]="COM1"; char sSettings[]="9600"; opencom(sPort, sSettings); //hier übergibst du die Adresse auf das erste Element von sPort, also einen Pointer int i=1; char sPort[10]; sprintf(sPort,"%s%d","COM",i); //fügt "COM" und "1" zusammen; i könnte aus deiner Listbox kommen
Alternativ könntest du std::string nehmen (für die Übergabe musst du dann die Methode c_str benutzen). Die MFC bietet auch eine schöne String-Klasse (CString), die eine Methode Format besitzt, mit der man genau wie bei sprintf formatieren kann. Was der BCB da bietet, weiß ich nicht.
-
Bidius schrieb:
Kurz und Schmerzlos: strcat() aus <string.h>
STL string container aus <string> sind aber meist die bessere Wahl.typedef std::basic_string<char> String; String myString = "ein string container";
Er sagt ja auch, dass er die Portnummer in einer int-Variable hat, da ist sowas wie sprintf praktischer, da man sich eine Konvertierung spart...
-
Danke _matze hat funktioniert
-
Dann kann er sich doch einfach den String mit Stringstream zusammenbauen. Z.B.:
int PortNr = 5; stringstream s; s << "Port " << PortNr; charFkt(s.str().c_str());
So kann man sich das rumhantieren mit gefährlichen Zeigern sparen.
-
_matze schrieb:
Die MFC bietet auch eine schöne String-Klasse (CString), die eine Methode Format besitzt, mit der man genau wie bei sprintf formatieren kann. Was der BCB da bietet, weiß ich nicht.
Die Format-Methode von System::String in C++Builder ist ähnlich zu sprintf, allerdings typsicher
(Es gibt auch System::String::sprintf, das wie printf funktioniert.)