C 得到一个奇数,真是奇数

C 得到一个奇数,真是奇数,c,visual-c++,C,Visual C++,以下是相关代码: char* url; url = "http://xxxx/index.txt"; TCHAR t_url[256]; charToTchar(url, t_url); downloadFile(t_url); 两个功能: charToTchar(const char *_char, TCHAR *tchar)

以下是相关代码:

            char* url;
            url = "http://xxxx/index.txt";

            TCHAR t_url[256];
            charToTchar(url, t_url);
            downloadFile(t_url);
两个功能:

            charToTchar(const char *_char, TCHAR *tchar)
            {
                int iLength ;  
                iLength = MultiByteToWideChar (CP_ACP, 0, _char, strlen (_char) + 1, NULL, 0) ;  
                MultiByteToWideChar (CP_ACP, 0, _char, strlen (_char) + 1, tchar, iLength) ;  
            }

            downloadFile(TCHAR *url_value)
            {
                TCHAR path[256];
                SHGetSpecialFolderPath(NULL, path, 28 , false);
                wcscat_s(path,  _T("\\check.txt"));

                char* c_url_value;
                c_url_value = "";

                int iLength ;  
                iLength = WideCharToMultiByte(CP_ACP, 0, url_value, -1, NULL, 0, NULL, NULL);  
                WideCharToMultiByte(CP_ACP, 0, url_value, -1, c_url_value, iLength, NULL, NULL);   

                DeleteUrlCacheEntry(c_url_value);  
                HRESULT hr = URLDownloadToFile(0, url_value, path, 0, 0);
            }
正确的TCHAR路径应如下所示:

C.:\…\L.o.C.a.L.\.C.h.e.C.k.…t.x.t

但当我第二次运行downloadFile函数时,TCHAR路径变得非常奇怪:

C.:\….\L.o.C.a.L.index.txt.k.t.x.t


ps我使用的是VC++,我认为它不支持wcscat。有解决方案吗?

如果字符集类型为Unicode,则从一开始就使用char*是不正确的

        TCHAR url[] = _T("http://xxxx/index.txt");
        DeleteUrlCacheEntry(url);  
        downloadFile(url);
函数DeleteUrlCacheEntry采用LPCTSTR

<>这个类型的定义取决于VisualC++的生成设置。如果构建是UNICODE,那么字符串类型是16位,而不是8位

因此,要与构建无关,使用的类型是TCHAR,可以使用_T宏来创建字符串常量

当选择的字符集类型为Unicode Visual Studio 2010时,以下程序将成功编译:

#include <tchar.h>
#include <windows.h>
#include <WinInet.h>

int main()
{
    TCHAR url[] = _T("http://xxxx/index.txt");
    DeleteUrlCacheEntry(url);  
}
如果选择UNICODE版本,则以下程序无法成功编译:

#include <tchar.h>
#include <windows.h>
#include <WinInet.h>

int main()
{
    char* url = "http://xxxx/index.txt";
    DeleteUrlCacheEntry(url);  
}
错误如下:

错误C2664:“DeleteUrlCacheEntryW”:无法将参数1从“char*”转换为“LPCWSTR” 指向的类型是不相关的;转换需要重新解释转换、C样式转换或函数样式转换


如果您确信它是UNICODE,并且永远不会是任何其他字符集构建,那么您可以避免所有这些,只使用std::wstring而不是TCHAR和_t。或者更好的是,您可以使用std::basic_字符串并利用可用的函数。

为什么要在char和TCHAR之间来回跳跃?它们不是一回事。DelteUrlCacheEntry使用指向TCHAR的指针,而不是char*。使用tchar定义的方法“\u tcscat”我建议url应该是const char*@PaulMcKenzie,因为如果我传递char*url,DelteUrlCacheEntry会出错。错误C2664:“DeleteUrlCacheEntry”:无法将参数1从“unsigned short*”转换为“const char*”ps。我正在执行一个unicode项目。@corn3lius Nah。。。仍然得到奇数值。没有人需要再支持windows 98了,没有理由再使用TCHAR或_T了。只要使用宽字符串。@Mgetz-没人是个大字。也许大多数。无论如何,我的最后一段强调了这一点。我得到了这样一条:“DeleteUrlCacheEntry”:无法将参数1从“unsigned short[42]”转换为“const char*”,那么您就不是在编译Unicode版本。看看我编辑的答案和小样本程序。当字符集类型为UNICODE时,它可以在VisualStudio2010中干净地编译 内置UNICODE:项目设置->c/c++->预处理器定义->UNICODE,UNICODE,对吗?