string zu charakter array konvertieren

Luja

Grünschnabel
Hallo,

ich muss nu für mein Programm nen CString in ein charakter array umwandeln, kann mir da jemand helfen? Im String stehen Zeichenketten getrennt duch ";", diese sollen dann in ein charakter array gespeichert werden um später duch dieses Array navigieren zu können. Ich habs so versucht
Code:
	i=0;
	BibFeld[i]=m_strBibRefs.Mid(0, m_strBibRefs.Find(';'));
	for (; BibFeld[strlen(BibFeld)]!='\n'; i++)
	{
	BibFeld[i+1]=m_strBibRefs.Mid(strlen(BibFeld), m_strBibRefs.Find(';'));
	}
MessageBox(BibFeld[i]);

Da kommen dann Konvertierungsfehler. Vielleicht hat da ja jemand Durchblick ;-)

Gruß,
Luja
 

langer1801

Erfahrenes Mitglied
Hi,
so kann das auch nicht funktionieren. Du mußt dir über die Unterschiede zwischen einem char-Array und einem CString klar werden. Ein char-Array ist, wie es der Name schon sagt, eine Ansammlung einzelner Zeichen. Dabei ist dem Compiler völlig egal, was an den einzelnen Array-Plätzen gespeichert wird. Selbstverständlich kann man in dem Array auch ganze Wörter oder Sätze speichern - für den Compiler ist das trotzdem 'ne Ansammlung von Einzelzeichen. Im Gegensatz dazu speichert ein CString-Objekt einen echten String, also ein Wort, Satz oder wie auch immer. Wenn du jetzt die Stringfunktionen Mid oder ähnliche anwendest, hast du danach einen Zeiger auf einen Substring - und den kannst du nicht in einem char-Array speichern.
Frage: Warum muß es ein char-Array sein? Speichere die Substrings doch in weiteren Strings oder einem String-Array, dann umgehst du die Probleme. Oder du mußt für jeden Substring ein Array definieren und den String dann Zeichen für Zeichen kopieren.

Mfg

langer
 

Gogul

Grünschnabel
Hallo!

Ich hab das gleiche Problem, deswegen häng ich mich hier mal an.

Ich muss ein CString in ein char Array konventieren, wobei die größe des Array fest ist(128 Zeichen). Das Array wird dann an eine Funktion übergeben die das dann blockweise auf einen chip speichert. Das zurückwandeln ist kein Problem!

Wie bekomm ich einen CString (ink. leerzeichen) in ein char array?
 

MCoder

Erfahrenes Mitglied
Hallo,

ich habe das so verstanden, dass bei kürzerem String die fehlenden Zeichen bis zu 128 mit Leerzeichen aufgefüllt werden. Ist das so richtig?
Wenn ja, könntest du das z.B. in einem Stringstream zusammenbauen:
C++:
#include <sstream>
#include <iomanip>

...

CString str = "ABCDEFG";
    
std::stringstream sstr;
sstr << (LPCTSTR)str.Left(128)
     << std::setfill(' ')
     << std::setw(128 - str.GetLength())
     << "";

SaveArray(sstr.str().c_str()) // Deine Funktion zum Speichern des Arrays
Gruß
MCoder
 

Gogul

Grünschnabel
Hallo!

Nein, ums Leerzeichen auffülen gehts nicht! Der String enthält Leerzeichen und diese müssen mit ins char Array!

Ich hab momentan folgende Krücke:
Code:
CString str="Hallo Du!";
char text[128];
swscanf(str,_T("%128s"),text); //wird zwar rüberkopiert, aber alles nach dem leerzeichen 
//ist weg und lauter NULLen sind kreuz und quer drinnen

DeleteNull(text); //NULLen wieder entfernen

Zum weiterarbeiten hat das halt gereicht, aber das muss auch irgentwie gescheit gehn...
 

MCoder

Erfahrenes Mitglied
Hallo,

sscanf() liest nur bis zum ersten Leerzeichen, daher fehlt dir alles, was danach kommt. Zum Kopieren eines Strings ist da strcpy() und Co. besser.
Mir ist aber immer noch nicht das Ziel der Kopieraktion klar. Falls "str" kürzer als 128 was soll denn dann im nicht verwendeten Bereich des Arrays stehen?

Gruß
MCoder
 

Gogul

Grünschnabel
Kopieren eines Strings ist da strcpy() und Co. besser.

das hab ich auch schon probiert:

Code:
CString str="Hi!";
unsigned char ucText[MAX];

strcpy(str,ucText);

geht nicht, da gibts folgende Fehlermeldung:

error C2664: 'strcpy' : cannot convert parameter 1 from 'Class String' to 'char*'

Mit was das am Ende aufgefüllt wird ist erstmal egal. Der Sinn der Sache: Ich hab ein GUI und muss die Eingaben die dort gemacht werden an eine Funktion,welche ein char array erwartet und auf die ich keinen Einfluss habe, übergeben!

Es geht also wirklich nur um CString->char array

Ich benutze übrigens MS eMbedded Visual C++ 4 & Windows CE 4.2
 

deepthroat

Erfahrenes Mitglied
das hab ich auch schon probiert:

Code:
CString str="Hi!";
unsigned char ucText[MAX];

strcpy(str,ucText);

geht nicht, da gibts folgende Fehlermeldung:

error C2664: 'strcpy' : cannot convert parameter 1 from 'Class String' to 'char*'
Warum verwendest du "unsigned char"?

Du hast die Parameter vertauscht. Um von str nach ucText zu kopieren muss der Aufruf lauten:
C++:
strpcy(ucText, str);
Gruß
 

Gogul

Grünschnabel
Warum verwendest du "unsigned char"?

Du hast die Parameter vertauscht. Um von str nach ucText zu kopieren muss der Aufruf lauten:
C++:
strpcy(ucText, str);
Gruß

ups :rolleyes:

ok nochmal:
Code:
char ucText[MAX];
CString str="Hallo!";
strcpy(ucText, str);

Fehler:

error C2664: ' strcpy' : cannot convert parameter 2 from 'class String' to 'const char*'
 

MCoder

Erfahrenes Mitglied
error C2664: ' strcpy' : cannot convert parameter 2 from 'class String' to 'const char*'
Womit wir wahrscheinlich wieder mal ein UNICODE-Problem hätten. Dazu müsstest du allerdings mehr Fehler bekommen haben, denn die Zuweisung für den CString ist auch nicht richtig.
Es gibt zwei Lösungsmöglichkeiten:

1. Du stellst in den Projekteigenschaften den Multibyte-Zeichsatz ein (Konfigurationseigenschaften -> Allgemein -> Zeichensatz)

oder

2. Du führst eine Konvertierung durch:
C++:
char ucText[MAX];
CString str = _T("Hallo!");
wcstombs(ucText, str, str.GetLength());
ucText[str.GetLength()] = '\0';
Gruß
MCoder