2010-09-15 79 views
1

我正在做一些串口通信到计算机控制的泵,并且我用来通信的createfile函数需要将com端口名称解析为wchar_t指针。我需要将char *(指针)转换为wchar_t *(指针)

我也使用QT创建一个窗体并获取com端口名称作为QString。

这QString的被转换为字符数组,并指出如下:

char* Dialog::GetPumpSerialPortNumber(){ 
    QString mystring; 
    mystring = ui->comboBox_2->currentText(); 
    char * mychar; 
    mychar = mystring.toLatin1().data(); 
    return mychar; 

我现在需要设置,其被存储为在我的泵对象的wchar_t *我的端口号。我通过调用下面的函数做到这一点:

void pump::setPortNumber(wchar_t* portNumber){ 
     this->portNumber = portNumber; 
    } 

因此如何改变我的char *(mychar)到wchar_t的*(端口号)?

谢谢。

+2

你的函数存在潜在的内存问题,它在一个临时变量(toLatin1()的结果)中返回一个指向内存的指针; – 2010-09-15 18:09:46

回答

-1
+0

我很明显做错了我的代码: wchar_t * Dialog :: GetPumpSerialPortNumber(){ QString mystring; mystring = ui-> comboBox_2-> currentText(); wchar_t * mycharPointer; wchar_t mychar [mystring.size()]; mychar [mystring.size() - 1] ='\ n'; mystring.toWCharArray(mychar); mycharPointer = mychar; cout << * mycharPointer; 返回mycharPointer; } 似乎返回一个地址,而不是字符数组到“COM6” – Zac 2010-09-15 12:36:18

0

您可以使用QStringtoWCharArray函数来得到您的wchar_t *值并从您的GetPumpSerialPortNumber函数返回一个wchar_t *。

4

如果你在谈论只是需要一个字符数组的数组wchar_t的,这里有一个解决方案为您:

static wchar_t* charToWChar(const char* text) 
{ 
    size_t size = strlen(text) + 1; 
    wchar_t* wa = new wchar_t[size]; 
    mbstowcs(wa,text,size); 
    return wa; 
} 
+0

mbstowcs是相当过时..但它的工作原理。 顺便说一句我发现很好的MSDN文章,显示各种字符串之间的转换。看看我的答案的细节.. – RredCat 2011-08-31 06:53:01

+0

但这可能会浪费一些内存,因为strlen将字节逐字节计数,而不是你需要多少wchar。检查我的答案,并纠正我,如果我错了,因为我是这个主题的新手。 – Naheel 2017-01-03 09:50:54

+0

@Naheel假定char *包含宽字符。如果char *只是一个ascii字符的字符串,而不是为一个wchar字符串填充并且您希望它,那么这就是您要使用的。如果你想获得一个wchar字符串的长度,你应该使用wcslen而不是滚动你自己的。 – leetNightshade 2017-01-04 23:25:30

0

到leetNightshade的答案的增强可能是

size_t unistrlen(const char *s) { 
    size_t sz = 0; 
    const char *sc; 
    for (sc = s; *sc != '\0'; sc+=(
     ((*sc&0x80)==0x80) ? 2 :/*1st byte of 2-byte character*/ 
     ((*sc&0xc0)==0xc0) ? 3 :/*1st byte of 3-byte character*/ 
     ((*sc&0xe0)==0xe0) ? 4 :/*1st byte of 4-byte character*/ 
     ((*sc&0xf0)==0xf0) ? 1 :/*2nd, 3rd, or 4th byte of multi-byte character*/ 
          1) /*single byte character*/) 
     if ((*sc&0xf0)!=0xf0) sz++; 
    return sz; 
} 

wchar_t* charToWChar(const char* text) { 
    size_t size = unistrlen(text) + 1; 
    wchar_t* wa = new wchar_t[size]; 
    mbstowcs(wa,text,size); 
    return wa; 
} 

凡unistrlen将返回多少字符串中的不同的strlen它通过字节返回长度字节,并且可能会浪费一些内存字符(单个或多个字节字符)如果你的字符串包含一些多字节字符。