|
You last visited: Today at 02:30
Advertisement
strlen :facepalm:
Discussion on strlen :facepalm: within the General Coding forum part of the Coders Den category.
10/30/2009, 22:32
|
#1
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
strlen :facepalm:
PHP Code:
std::wstring str = (LPCTSTR)LszDirName;
AfxMessageBox(LszDirName,NULL,NULL);
const char* str2 = (char*)str.c_str();
LPCTSTR str3 = str.c_str();
MessageBox((LPCTSTR)str3,NULL,MB_OK);
AfxMessageBox((LPCTSTR)(str2),NULL,NULL);
unsigned int Labzug = static_cast<unsigned int>(strlen(str2));
AfxMessageBox(_T(abzug));
Die Variable abzug brauche ich, da ich die Länge später von etwa abziehen muss.
Allerdings ist die MsgBox immer leer.
Alles andere geht nach langem Suchen, wie mans denn konvertiert endlich.
in LszDirName ist der Pfad dieser Exe gespeichert.
Dieser wird von allen MsgBoxen die den String ausgeben auch richtig angezeigt, aber dieses dumme strlen macht mir Probleme -.-
Ok, die letzte MsgBox ignorieren, da es da eh einen Fehler gibt, da uInt dort nicht hingehört! Das war nur ein kleiner Versuch^^ mit der normalen MsgBox von Windows gehts!
Nur wie gesagt, sie ist leer.
Der cast ist dort, weil ich irgendwo gelesen habe, dass man vorher konvertieren muss, was für mich auch logisch klang, da es mit dem einfachen Rückgabewert nicht geklappt hat.
Einen Konvertierungsversuch wars wert, hat aber trotzdem nichts gebracht.
Ich bin echt am Verzweifeln.
Hat einer eine Lösung?
Danke im Voraus
|
|
|
10/31/2009, 00:31
|
#2
|
elite*gold: 20
Join Date: Sep 2006
Posts: 1,100
Received Thanks: 184
|
Also deine Code macht nicht wirklich viel Sinn, du kopierst einfach nur LszDirName in 3 verschiedene Strings, einmal als Unicode in std::wstring und zwei mal als Cstring, einmal constant und einmal mit der Windows.h definition von char*.
Wenn ich dich richtig verstanden habe ist dein Problem das du die Länge des Strings LszDirName heraus bekommen möchtest, das würdest du mit folgendem Code erreichen:
PHP Code:
size_t len = strlen(LszDirName);
Ich bin mal davon ausgegangen dass es sich bei LszDirName um einen normalen cstring handelt, wenn die die Länge eines in einem string Objekt gespeicherten String erfahren möchtest dann rufst du einfach die String Member Funktion string::size() auf die wie strlen der cstring library die Länge des Strings als size_t zurück gibt, das sieht dann so aus
PHP Code:
size_t len= StringObjekt.size();
size_t ist als unsigned int definiert.
Ich hoffe ich konnte dir helfen, denn so richtig klar ist mir nicht was dein Problem ist ^^
|
|
|
10/31/2009, 13:21
|
#3
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
oh zum Teil konntest du ja^^
bei LszDirName handelt es sich um einen CString
Den muss ich verkürzen.
Da habe ich eben ein bisschen gesucht, aber nur die Funktion zum verkürzen eines std::string s gefunden.
Also habe ich ihn in einen string kopiert.
So aber für strlen braucht man einen const char* also musste ich diesen nochmal in einen konvertieren!
Den letzten string brauche ich, für die MessageBox Ausgabe, da dort ein const char* nicht akzeptiert wird!
Die MessageBoxen sind reine Debugausgaben, um den Fehler zu finden, deshalb wird str3 auch später wieder verschwinden! Allerdings hat es mit allen Konvertierungen hingehaun und in allen MessageBoxen wird der richtige String ausgegeben
So nun müsste ich ja von str2 die Länge ermitteln können und das habe ich auch getan und dann wollte ich es auch aus Debuggründen ausgeben.
Nur leider steht in der Box nix.
Die letzte MessageBox wie gesagt ignorieren, da ich wie gesagt da nur etwas getestet habe.
Der ganze Sinn soll sein, die Länge des CStrings zu erfahren nur Google hat nur eine Möglichkeit ausgespuckt, die Länge eines std::strings zu erfahren!
So kam es zu dieser ganzen Konvertierungsgeschichte
beide deine Lösungen klappen nicht
CString kann nicht in const char* konvertiert werden steht bei der ersten und
kommt wieder nur eine leere msgBox
|
|
|
10/31/2009, 17:49
|
#4
|
elite*gold: 150
Join Date: Apr 2007
Posts: 2,394
Received Thanks: 6,644
|
|
|
|
10/31/2009, 18:02
|
#5
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
danke wurstbrot ist schon nicht mehr nötig schau ich mir aber trotzdem mal an
habs jetzt irgendwie geschafft
auch wenn die MsgBox die Zahl nicht angezeigt hat, egal ob str.size oder strlen
hat es trotzdem mit dem weiterverarbeiten geklappt
durch ganz viel rumkonvertiererei gehts jetzt^^
allerdings hat der rest eine frage aufgeworfen:
PHP Code:
LPCTSTR Lstr2 = (LPCTSTR)str.c_str(); LPTSTR strExtra = L"\\ressources\\ressource.exe"; _tcscat_s((LPTSTR)_T(str2),MAX_PATH,strExtra);
gibt einen Fehler beim Debug aus
ALso kompilieren geht, aber es gibt ein Problem mit dem Speicher.
Das Programm funktioniert zwar trotzdem, aber die Fehlermeldung nervt und es ist ja auch nicht gerade gut, wenn auf nicht zugelassenem Speicher versucht wird zu schreiben, auch wenn nix passiert wegen Zugriffsverweigerung^^
in str ist der Pfad der Datei
diesem möchte ich nun ein unterverzeichnis mit _tcscat_s hinzufügen
so obwohl der Pfad nicht MAX_PATH übersteigt, gibts nen Fehler wegen Speicher.
Ohne _s gibts nen Fehler wegen Overflow und mit gibts nen Fehler wegen Zugriffsverweigerung.
Komischerweise gehts danach trotzdem ohne Probleme mit dem Programm weiter und es kopiert sogar eine Datei aus dem Unterverzeichnis raus O.o also irgendwie verwirrt mich das.
Gibt es eigentlich eine bessere Variante das aktuelle Verzeichnis herauszufinden, ohne den Namen der Datei mit drin zu haben?
Deswegen kams nämlich zu diesem ganzen Müll.
Weil ich mit der Funktion GetModuleFileName den Namen mit drin hab, musste ich ihn ausfiltern (gibts dafür ne Funktion für TCHAR oder CString?) ich habe nämlich keine gefunden.
Nur die für std::string
Also wandelte ich in string um, zog den Dateinamen ab konvertierte zurück und nun wollte ich eben das unterverzeichnis anhängen was auch geht und später im Programm sogar verwendet werden kann, nur gibts zu dem Zeitpunkt eben einen Speichefehler 
Ich weiß es ist nicht das eleganteste, aber ich habe eben nicht das richtige gefunden.
Ich suche:
Eine Funktion die das aktuelle Verzeichnis findet und einen TCHAR oder LPCTSTR oder LPSTR oder CString zurückgibt.
Oder wenn ich eben doch die nehmen muss, die den Namen der Datei mit enthält,
eine Funktion mit der ich einen String in Teile aufteilen kann, um den Namen da weg zu kriegen. Der Rückgabewert sollte auch einer der genannten sein.
oder wenn man nicht direkt mit einem Substring wie bei strstr arbeiten kann dann zumindest eine Funktion die wie string.substr arbeitet, wo ich dann eben das Ergebnis von GetLength nutzen kann, um an der richtigen Stelle abzuschneiden.
Denn es nervt echt, zig mal hin und her konvertieren zu müssen und am Ende auch noch einen Speicherfehler zu haben -.-
|
|
|
10/31/2009, 21:41
|
#6
|
elite*gold: 150
Join Date: Apr 2007
Posts: 2,394
Received Thanks: 6,644
|
Code:
TCHAR buffer[128];
GetCurrentDirectory(128, (LPWSTR)buffer);
MessageBox(0, (LPWSTR)buffer, L"current directiory", MB_OK);
wcscat_s(buffer, 128, L"\\hi.exe"); // falls du noch was dranhängen willst...
MessageBox(0, (LPWSTR)buffer, L"Pfad...", MB_OK);
Wenn ich dich richtig verstanden hab, brauchst du ja einfach nur den Pfad zum Ordner indem die Datei liegt oder ? ^^
Falls ich dich falsch verstanden hab sag bescheid ^^
|
|
|
10/31/2009, 22:07
|
#7
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
genau so ists!
leider habe ich nur eine funktion gefunden, die den pfad+namen der datei zurückgibt
also wollte ich den namen abtrennen
dazu habe ich aber nix zu CString und TCHAR gefunden!
also habe ich in std::string konvertiert und dessen funktion dafür genommen
da der pfad ja aber sonst wie lang sein kann musste ich "von hinten abschneiden"
dafür brauchte ich eine funktion die die länge ermittelt, damit ich dann die länge des namens abziehen kann (was ja auch nicht mehr funktioniert wenn jemand den namen ändert).
naja und beim rückkonvertieren zum weiterverarbeiten gabs eben diesen speicherfehler
naja was nicht alles passieren kann, wenn man nicht gleich die richtige methode findet^^
aber ich hab mir echt die finger wund gegooglet auf englisch und deutsch und auch die msdn genutzt
und ich habe eben nur die funktion zum trennen eines std::strings und die funktion die pfad+namen zurückgibt gefunden^^
aber lange rede kurzer sinn: ja hast du
hm... zu der sache mit GetCurrentDirectory:
diese funktion habe ich auch schon gefunden
allerdings stand in der msdn, dass das eine funktion ist, die einen DWORD zurückliefert, der die anzahl der (jetzt bin ich nicht mehr sicher ob bytes oder zeichen) gespeichert hat.
liege ich da richtig?
wenn ja wie kann mir das denn helfen?^^
wenn nein.... hm komische msdn
Quote:
GetCurrentDirectory Function
Retrieves the current directory for the current process.
DWORD WINAPI GetCurrentDirectory(
__in DWORD nBufferLength,
__out LPTSTR lpBuffer
);
Parameters
nBufferLength
The length of the buffer for the current directory string, in TCHARs. The buffer length must include room for a terminating null character.
lpBuffer
A pointer to the buffer that receives the current directory string. This null-terminated string specifies the absolute path to the current directory.
To determine the required buffer size, set this parameter to NULL and the nBufferLength parameter to 0.
Return Value
If the function succeeds, the return value specifies the number of characters that are written to the buffer, not including the terminating null character.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
If the buffer that is pointed to by lpBuffer is not large enough, the return value specifies the required size of the buffer, in characters, including the null-terminating character.
|
ach jetzt fällts mir auf^^ man nutzt nicht den rückgabewert sondern den lpBuffer^^
DANKE DIR
|
|
|
10/31/2009, 22:16
|
#8
|
elite*gold: 150
Join Date: Apr 2007
Posts: 2,394
Received Thanks: 6,644
|
Kein problem. Naja jetzt weisst du das du immer alles lesen solltest
wenn du eine Funktion noch nicht kennst ^_^
|
|
|
10/31/2009, 23:06
|
#9
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
mich würde aber trotzdem interessieren, warum es nen speicherfehler gibt, obwohl eigentlich alles richtig sein müsste =/
edit: und mal eine frage die damit eher weniger zutun hat:
wie kann ich auf MultiByte stellen?
ich habe mal gelesen, dass das weniger Probleme als Unicode bringt.
allerdings gibts in VS 2008 nur die Option Unicode Bibliotheken nutzen (Ja/Nein)
aber ich denke mal, wenn ich nein wähle, wirds Ansi.
ich bin verwirrt^^
edit:
     
hab ne memberfunktion die genau das mit CString ODER TCHAR erreicht hätte, was ich indirekt vor hatte -.-
nämlich den Namen der Datei abziehen und dann das Unterverzeichnis hinzufügen
siehe CString::Replace
warum finde ich sowas erst immer nach öffnen eines threads? xD
Remove gibts dann auch noch  man warum find ich das erst jetzt >.<
|
|
|
11/01/2009, 00:34
|
#10
|
elite*gold: 150
Join Date: Apr 2007
Posts: 2,394
Received Thanks: 6,644
|
MAX_PATH.

Für Multibyte, einfach rechtsklick auf dein Projekt --> Eigenschaften --> Konfigurationseigenschaften --> Allgemein --> Zeichensatz
|
|
|
11/01/2009, 02:25
|
#11
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Ja aber eben die Option ist bei meinem Visual Studio 2008 nicht mehr da!
Da ist kein Menü Zeichensatz
Ich habe irgendwo gelesen, dass ab 2008 nur noch in unicode kompiliert werden kann =/
p.s. danke da war ich selbst^^ aber die beschreibung der funktion hat mir beim erkennen des grundes des speicherfehlers nicht geholfen =/
edit: moment verstehe ich dich richtig, dass du mir sagen willst, dass ich nicht MAX_PATH sondern 260 schreiben muss? komisch -.-"
TCHAR darf ja auch nix dynamisches haben, sondern nur eine absolute zahl, aber die angabe vom OS MAX_PATH geht
da frag ich mich warum das da nicht geht; was ist denn wenn irgendwo anders der Pfad länger oder kürzer sein kann?^^
naja egal wenigstens habe ich endlich eine antwort, wenn ich dich richtig verstanden habe^^
|
|
|
11/01/2009, 05:38
|
#12
|
elite*gold: 150
Join Date: Apr 2007
Posts: 2,394
Received Thanks: 6,644
|
Naja, die Funktion wurde auch falsch benutzt, du hattest ja einen const char pointer auf einen string. Und es geht darum das du bei der 2.n Angabe die Anzahl der Elemente angeben musst. So zb sollte es gehen:
Code:
wchar_t* buffer = new wchar_t[MAX_PATH];
_tcscat_s(buffer, MAX_PATH, L"hallo"");
PS:
Eigentlich solltest du bei 2008 auch auf Multibyte stellen können, bei mir ist es jedoch ziemlich lange her das ich mit 2008 gearbeitet hab. Guck einfach mal durch die Einstellungen ^^
|
|
|
Similar Threads
|
:facepalm:
05/30/2011 - Quotes - 40 Replies
Joa, ziemlich unbeliebtes Mädel von meiner Schule, welches sich gerne mal aufspielt und kleine Brüste hat :rolleyes:
|
Facepalm
03/19/2010 - Off Topic - 4 Replies
Hey Community,
ich wollte mal ein Thread eröffnen da ich langeweile habe indem jeder seine besten facepalm Bilder postet.
Ich fang dann mal an
http://www.motifake.com/image/demotivational-post er/0903/epic-face-palm-face-palm-demotivational-po ster-1236742013.jpg
http://i173.photobucket.com/albums/w42/barrow_co2 /Facepalm.jpg
|
Help :facepalm:
10/22/2009 - Metin2 Private Server - 8 Replies
sry wegen den tread da ich nur was wegen meinen server schreibe da das aber eh gespamme ist sry :facepalm: self own3d
also meine FRAGE: kann mir einer einen link geben wo ein VTUT beschreibt wie man gm rechte für einen eigenen server bekommt pls help;)
#push
|
facepalm
07/20/2009 - Off Topic - 1 Replies
eine runde facepalms für diesen sinnlosen thread
ich fange an
:facepalm:
|
All times are GMT +1. The time now is 02:31.
|
|