char* in std::string konvertieren



  • Hallo,

    ich hoffe, dass mir jemand helfen kann.

    mein Vorhaben:
    Ich habe 2. Funktionen.

    Funktion 1:
    liefert mir einen std::string der in etwa so aussieht:
    {FE5723B0-CB9C-4102-818E-FAFAA678959C}

    Funktion 2:
    lifert mir einen char* (Unicode) der so aussehen kann:
    rpcap://\Device\NPF_{FE5723B0-CB9C-4102-818E-FAFAA678959C}

    Nun will ich prüfen ob der string(von Funktion 1) im char*(von Funktion 2) enthalten ist.

    Meine Frage:
    Ist es möglich einen Unicode char* in einen std::string umzuwandeln?
    Wie geht das?

    Freue mich sehr über jede Antwort, auch über andere Ansätze oder Ideen

    Vielen Dank im voraus
    Gruß Tupo13



  • UNICODE wäre wchar_t* - und den kannst du bestenfalls in einen wstring umwandeln.
    char* (ASCII-String) kannst du problemlos per Konstruktor nach std::string umwandeln und anschließend dessen find()-Methode verwenden, um nach potentiellen Teilstrings absuchen:

    string p1=func1();
    string p2=func2();
    size_t pos=p2.find(p1);
    if(pos!=string::npos)
      cout<<"Gefunden an Position "<<pos<<endl;
    else
      cout<<"nicht gefunden"<<endl;
    


  • @ CStoll

    Danke für deine schnelle Antwort:

    wie du vielleicht schon vermutest kenne ich mich noch nicht so gut aus.

    um auf deinen Tipp zurückzukommen:
    Wenn ich es so mache wie du es sagst habe ich folgendes Problem:

    bei der Ausgabe con string p1 funktioniert alles. Will ich aber jetzt den string p2 also der der zuvor char* war ausgeben bekomme ich nichts als Ausgebe.

    Vielleicht noch als zusätzliche Bemerkung. Wenn ich ihn aber als char* lasse und in so ausgebe

    printf("Device1: %s\n", dev);
    

    dann bekomme ich die richtige Anzeige



  • Kannst Du mal ein ganzes Beispiel posten und nicht nur erklären?



  • @ Jochen Ok werde ich machen, danke

    Hier der Code:

    1.
    So bekomme ich den std::string, der z.B so
    {FE5723B0-CB9C-4102-818E-FAFAA678959C} aussieht

    std::string

    std::string initialize::GetMACaddress(void)
    {
    	std::string IPS;
    
    	IP_ADAPTER_INFO AdapterInfo[16];			// Allocate information for up to 16 NICs
    	DWORD dwBufLen = sizeof(AdapterInfo);		// Save the memory size of buffer
    
    	DWORD dwStatus = GetAdaptersInfo(			// Call GetAdapterInfo
    		AdapterInfo,							// [out] buffer to receive data
    		&dwBufLen);								// [in] size of receive data buffer
    	assert(dwStatus == ERROR_SUCCESS);			// Verify return value is valid, no buffer overflow
    	PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;// Contains pointer to current adapter info
    
    	IPS=pAdapterInfo->AdapterName;
    
    	std::cout <<IPS<< std::endl; 
    
    return IPS;
    
    }
    

    2.
    So lese ich alle Netzadapter in das array testa, welches vom Typ char* ist.
    Wenn ich ein Element des Feldes so ausgebe:

    printf("Device1: %s\n", testa[1]);
    

    erhalte ich eine Ausgabe, die z.B. so aussieht
    rpcap://\Device\NPF_{FE5723B0-CB9C-4102-818E-FAFAA678959C}

    char* testa[10]; 
    
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
        {
            fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
            exit(1);
        }
    
        /* Print the list */
        for(d=alldevs; d; d=d->next)
        {
            printf("%d. %s", ++i, d->name);
    
    		testa[i]=d->name;
    		if (d->description)
                printf(" (%s)\n", d->description);
            else 
            printf(" (No description available)\n");
        }
    
    printf("Device1: %s\n", testa[1]);
    

    3.
    Was will ich machen:
    Nun will ich schauen in welchem Element von testa der string enthalten ist.

    4.
    Frage:
    gibt es vielleicht eine Funktion, welche das selbe wie

    printf("Device1: %s\n", testa[1]);
    

    macht, nur eben nicht ausgibt, sondern in einen std::string schreibt?

    Vielen Dank für eure Mühen
    Gruß Tupo13



  • next Time -> C++ Board, das haben nix mit MFC zu tun 🙂



  • @Pallaeon
    OK das nächste mal weiß ich das, dachte weil VC++ in Klammer steht

    -> falsch gedacht



  • Erstens: Was hindert dich daran, komplett auf std::string umzusteigen?

    4.
    Frage:
    gibt es vielleicht eine Funktion, welche das selbe wie

    printf("Device1: %s\n", testa[1]);
    

    macht, nur eben nicht ausgibt, sondern in einen std::string schreibt?

    Mit C-Strings kannst du über "sprintf(buffer,"Device1: %s\n", testa[1]);" die Daten statt auf Bildschirm in ein char-Array schreiben, für C++-Strings empfehle ich eher "string s=string("Device1: ")+testa[1]+"\n";" (oder da wir im MFC-Board sind: CString::Format()).



  • Hallo, danke euch vielmals für eure Hilfe 👍

    Ich habe es jetzt so gemacht:

    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
        {
          exit(1);
        }
    
        /* Save the list */
        for(d=alldevs; d; d=d->next, i++)
        {
        devices[i]=std::string(d->name);
        max_dev=i-1;
    	}
    
    for (i=1;i<=max_dev;i=i+1)
    {
    size_t pos=devices[i].find(strAdaptername);
    if(pos!=std::string::npos)
    {
    	iAdapternr=i;
    	break;
    }
    
    }
    
    std::cout<<"Adapter "<<iAdapternr<<std::endl;
    

    Gruß Tupo13


Anmelden zum Antworten