2010-02-18 154 views
8

錯誤C2664: 'strcpy的':無法從 'TCHAR *' 轉換參數1到 '字符*' 代碼:爲什麼不能轉換TCHAR *爲char *

LPCTSTR name, DWORD value 
strcpy (&this->valueName[0], name); 

錯誤C2664: 'strlen的' :無法從「LPCTSTR」轉換參數1「爲const char *」

LPCTSTR name; 
strlen (name)  

上述一類的代碼在另一個項目中工作得很好,我找不到爲什麼它不在這個工作的原因MS VS2010項目。

回答

13

定義_UNICODE時,需要使用諸如wcstombs之類的函數。要麼是這樣,要麼只是在TCHAR字符串上使用_tcslen(查看通用文本例程映射),編譯器將根據您是否使用unicode將其轉換爲strlen或wcslen。

+1

這篇文章剛剛爲我節省了幾個小時。新的C++項目的默認值是使用Unicode字符集。關閉它,修復這些錯誤。 – 2010-03-18 19:35:11

+0

感謝您的鏈接。 wcslen在這裏爲LPCTSTR工作 – rogerdpack 2011-09-23 16:05:09

7

很可能是因爲TCHAR被定義爲您的項目中的一個字符,但不是在VS2010中,它可能是wchar_t。

如果您的項目定義了UNICODE/_UNICODE,這與在項目設置中將其指定爲Unicode構建相同,則TCHAR將爲wchar_t。

您基本上需要決定是否使用Unicode,如果需要,您需要將strncpy等的常規調用更改爲wide-char等效項或使用與TCHARs相同方式更改的t變體做。看看strncpy或其他函數的幫助,看看廣泛的或t變體被稱爲什麼。

您還可以查看MSDN的電話號碼,例如strcpy,您可以在其中看到wide-char版本名爲wcscpy,t版本名爲_tcscpy。如果你打算在不同的項目中使用UNICODE或不使用UNICODE的代碼,或者做出明智的決定,你會使用哪一個,然後堅持使用,我建議你堅持使用t版本。哪個更好取決於你的場景,我會說,並可能援引一些「宗教」意見...

+0

如果是這樣,我該如何解決它? – Christoferw 2010-02-18 10:41:15

+0

@Christoferw:我更新了我的答案,給你一個關於如何解決這個問題的指針。如果您需要更多幫助,請寫另一條評論。 – villintehaspam 2010-02-18 10:42:28

+0

但我沒有一個unicode項目.... – Christoferw 2010-02-18 10:54:27

3

您的項目是一個unicode項目?如果是的話,我相信TCHAR將相當於wchar_t而不是char使您的轉換嘗試失效。 See here欲瞭解更多信息。

+0

不,這是一個多字節項目 – Christoferw 2010-02-18 10:41:32

+0

那麼它顯然不是或你不會得到這個問題... – Goz 2010-02-18 10:51:48

+0

它在Visual Studio中的項目設置中被選中: 字符集:使用多字節字符集 – Christoferw 2010-02-18 10:56:50

4

下面是一些代碼,會做的伎倆對你來說,它最初發佈於www.wincli.com/?p=72但在這裏我封裝成一個小班:)

class char_args 
{ 
private: 
char **l_argn; 
int arg_num; 

int wstrlen(_TCHAR * wstr) 
{ 
    int l_idx = 0; 
    while (((char*)wstr)[l_idx] != 0) l_idx += 2; 
    return l_idx; 
} 

// Allocate char string and copy TCHAR->char->string 
char *wstrdup(_TCHAR *wSrc) 
{ 
    int l_idx = 0; 
    int l_len = wstrlen(wSrc); 
    char *l_nstr = (char *)malloc(l_len); 
    if (l_nstr) { 
     do { 
      l_nstr[l_idx] = (char)wSrc[l_idx]; 
      l_idx++; 
     } while ((char)wSrc[l_idx] != 0); 
    } 
    l_nstr[l_idx] = 0; 
    return l_nstr; 
} 

char_args & operator=(const char_args&); // does not allow assignment of class 
char_args(const char_args&); // does not allow copy construction 

public: 
char_args(int argcc, _TCHAR* argv[]) : arg_num(argcc) 
{ 
    l_argn = (char **)malloc(argcc *sizeof(char*)); 
    for (int idx = 0; idx < argcc; idx++) l_argn[idx] = wstrdup(argv[idx]); 
} 

~char_args() 
{ 
    for(int idx = 0; idx < arg_num; idx++) if (l_argn[idx]) free(l_argn[idx]); 
    free(l_argn); 
} 

const char * operator[](const int &i) 
{ 
    if (i < arg_num) return l_argn[i]; else return 0; 
} 

const int argc() { return arg_num; } 
}; 

這裏是使用該代碼的示範:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char_args C_ARGV(argc, argv); 
    for(int i = 0; i < C_ARGV.argc(); i++) cout << C_ARGV[i] << endl; 
} 
相關問題