Announcement

Collapse
No announcement yet.

wstring to wchar_t, die wahre Länge?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • wstring to wchar_t, die wahre Länge?

    Guten Morgen Community

    Ich mach gerade meine ersten gehversuche in C/C++.

    Ich möchte die wahre Länge (Variabale size_t sT2) des wchar_t-Strings von der Klasse aus übergeben. Das funktioniert aber so wie ich das mache nicht.

    Auch prüfe ich zu einem späteren Zeitpunkt mit einer For-Schleife jedes einzelne Zeichen im 'wchar-_t-String' und brauche dazu die reale Länge.

    Auf was muss ich hier den achten?

    Besitze MS Visual C++ 2010 Express. Windows Vista-32.

    Danke für die Hilfe.


    Freundliche Grüsse

    exc-jdbi


    Code:
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <Windows.h>
    
    class MyClass{
    public:
    	static size_t WString2WChar_t(std::wstring *ws, wchar_t *wc);
    private:
    };
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	//Irgendein wString
    	std::wstring wSt=L"早上好社区 - Und noch ein paar Sonderzeichen ‰€@©®²³";
    	size_t s = wSt.length();
    	
    	//I.O. Hier wird das letzte Zeichen ausgegeben
    	wchar_t w = wSt[s-1];
    
    	wchar_t *wCh = L"";
    	size_t sT2 = MyClass::WString2WChar_t(&wSt,wCh); 
    	if(sT2>0 || wCh != L""){
    		//Prüfung
    		//Wenn ich die vorgegebene Länge als Zeichen ausgebe, kommt nicht wie erwartet
    		//das letzte Zeichen, wie es im z.B. wString ist.
    		wchar_t wCh2 =wCh[sT2];
    		
    		....
    
    		//Mit For-Schleife durch jedes einzelne Zeichen
    
    
    		For(...){
    		     ....
    		}
    	}
    
    	return 0;
    }
    
    size_t MyClass::WString2WChar_t(std::wstring *ws,wchar_t *wc){
    	wc=L"";
    	size_t ret = 0;	
    	try{
    		if((*ws).length()==0)
    			return ret;
    
    		wc=&(*ws)[0];
    		return std::wcslen(wc);
    	}
    	catch(std::exception &ex){
    		std::cout<<"WString2WChar_t: "<<ex.what()<<std::endl;
    		return ret;
    	}
    }

  • #2
    Was ist die wahre Länge?
    Warum wird der Methode WString2WChar der Parameter wc übergeben, wenn er gleich überschrieben wird?
    Christian

    Comment


    • #3
      Guten Morgen Christian Marquardt

      Danke für die Antwort.

      Ich wollte mir die Convertierung von wstring zu wchar_t verinnerlichen. Es stimmt schon, hier wird die Variable gleich umgeschrieben. DAs ist aber für diesen ZWeck unumgänglich


      Die wahre Länge der Variable wCh2 müsste um 3 Unicodezeichen länger sein. Das letzte Zeichen '³' liegt bei 50 und nicht bei 47, wie es im Moment in der Variable sT2 steht.

      Freundliche Grüsse

      exc-jdbi

      Comment


      • #4
        Guten Abend Christian Marquardt

        Ich hab mir jetzt in der Klassenfunktion eine eigenständige Variable wwh gemacht (losgelöst von wc).

        Die Variable wCh in der tMain hat ein komplett anderes Format als die Variable wc . Ist es irgendwie möglich das selbe Format schon in der Klassenfunktion zu erhalten?

        Code:
        if((*ws).length()==0)
            return ret;
        					
        std::vector<wchar_t> buffer;
        buffer.reserve((*ws).length()+10);
        		
        for(unsigned int i=0;i<(*ws).length();++i)
            buffer.push_back((*ws)[i]);				
        buffer.push_back(L'\0');
        
        wchar_t wwh[1024]={};
        wmemcpy(wwh,&buffer[0],buffer.size());
        
        wc=&wwh[0];
        return std::wcslen(wwh);
        Danke


        Freundliche Grüsse

        exc-jdbi

        Comment


        • #5
          Fehler gefunden

          ByPointer hab ich falsch gesetzt.

          Die übergabe muss so heissen
          Code:
          static size_t WString2WChar_t(const std::wstring *ws, wchar_t *(&wc));
          Danke und Freundliche Grüsse

          exc-jdbi

          Comment


          • #6
            Was verstehst du unter Format?

            wchar_t *wCh

            ist ein Zeiger auf wchar_t


            Wenn du soetwas in der Klasse willst, definiere eine Instanzvariable

            private wchat_t *meine_neue_wCh;
            Christian

            Comment


            • #7
              Sorry das war mein fehler.

              Ich bin die ganze Zeit davon ausgegangen, dass die beiden Variablen die gleiche Adressate haben.

              Ich hab mir natürlich heute morgen schon gefragt, warum das unterschiedliche Formate bestehen. Der Wert der Variable 'wCh' beginnt mit 4 Nullen, was typisch ist für UniCode. In der Klassenfunktion hingegen nicht. Bei der ByPointerÜbergabe wurde immer wieder eine Kopie gemacht, darum sind plötzlichzwei verchiedene 'Formate' entstanden. Aber jetzt ist das Problem gelöst.

              Nochmals danke für die Unterstützung.

              Freundliche Grüsse

              exc-jdbi

              Comment

              Working...
              X