The LPCSTR type string is garbled or displayed error

1.2k Views Asked by At

I have a LPCSTR that I want to convert to std::string or char*.

LPCSTR strName;
_tprintf(_T("%s\n"), strName);

I'm trying to get all the audio equipment on the computer and displayed, but to get the LPCSTR type of direct output is garbled, use the above code to output the correct results.

Is there a way to save the correct output?

The following is the complete code:

Add a dependency to the property:
comctl32.lib;winmm.lib;dsound.lib;dxguid.lib;odbc32.lib;odbccp32.lib

ListSoundDev.h

#ifndef _LISTSOUNDDEV_HEAD_
#define _LISTSOUNDDEV_HEAD_
#include<tchar.h>
#include <dshow.h>
#include<iostream>
#include<vector>
#include<mmsystem.h>
#include<mmreg.h>
#include<dsound.h>

#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "Quartz.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "dsound.lib")
#pragma comment(lib, "dxguid.lib")

#pragma comment(lib, "strmiids")
using namespace std;

typedef struct _DevItem
{
    LPCSTR strName;
    GUID guid;
} DevItem;
#endif

main.cpp

#include"ListSoundDev_head.h"
std::vector<DevItem>    m_CapDevices;
BOOL CALLBACK DSEnumCallback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext)
{
    std::vector<DevItem> *pLst = (std::vector<DevItem> *) lpContext;
    if (pLst)
    {
        DevItem item;
        memset(&item, 0, sizeof(item));
        item.strName = lpcstrDescription;
        if (lpGuid)
            item.guid = *lpGuid;
        else
            item.guid = GUID_NULL;
        pLst->push_back(item);
        return TRUE;
    }
    return FALSE;
}
int main()
{
    std::vector<DevItem>::iterator it;
    HRESULT hr = S_OK;
    setlocale(LC_ALL, "chs");
    hr = DirectSoundCaptureEnumerate((LPDSENUMCALLBACKW)DSEnumCallback, (LPVOID)&m_CapDevices);
    for (it = m_CapDevices.begin(); it != m_CapDevices.end(); it++){
        _tprintf(_T("%s\n"), it->strName);//output correct
        printf("%s\n",it->strName);//output error
        std::cout << it->strName << std::endl;//output error
    }
}

Expected output:

麦克风 (Realtek High Definition Au

Actual output:

KQ螛

Expected output:

Realtek Digital Input (Realtek

Actual output:

R

How can I that printf() or std::cout can directly output the correct results?

1

There are 1 best solutions below

2
H S T On

Thank you very much for your answer, I have solved this problem.

The solution is to use the following code to convert.

The character set is Unicode.

char newStr[100];
wcstombs(newStr, (wchar_t*)it->strName, 100);
printf("newStr=%s\n", newStr);

The character set is Multibyte

printf("%s\n", it->strName);

However, when I write this program in the C + + console to obtain the name of the audio device for the microphone (Realtek High Definition Au, but in MFC using this code to get the device name for the microphone (Realtek High Definition Audio) What is the reason?