【问题标题】:LPCTSTR concatenation with StringCchCatLPCTSTR 与 StringCchCat 的连接
【发布时间】:2012-08-23 22:36:42
【问题描述】:

嗯,我是 c++ 的新手,所以在几个项目让我对 c++ 有了基本的了解后,我决定做一些简单的事情(不,hello world 不算在内),我只想做一个%appdata% 上的文件夹,我发现我只需要这样做

void MakeFolder()
{
LPCTSTR appdata = getenv("APPDATA");
char *appchar = getenv("APPDATA");
size_t sizeApp = sizeof(appchar) + 8;
LPCTSTR folder = "/Folder";
StringCchCat(appdata, sizeApp, folder);
CreateDirectory (appdata,NULL);
}

但它说“StringCchCat:找不到标识符”,我已经包含了 STDDEF.h,并且错误代码没有改变!但我不确定代码本身是否能正常工作......

【问题讨论】:

  • 根据这个msdn.microsoft.com/en-us/library/windows/desktop/…你需要包含Strsafe.h
  • 您不想在刚开始使用 C++ 时进入 Windows API 的复杂世界。 Boost 有一个很棒的文件系统库,它是跨平台的,使用实际的字符串,而不是 typedef 的 C 字符串,并且符合 C++ 的流程(即它不是用 C 编写的)。

标签: c++ concatenation


【解决方案1】:

StringCchCat<strsafe.h> 中声明;您需要包含该标题。

但是...既然您是 C++ 新手,请不要乱用 C 字符串。使用std::string:

char const* const raw_appdata = getenv("APPDATA");
if (raw_appdata == nullptr)
{
    // Handle error
}

std::string const appdata = raw_appdata;
std::string const folder  = appdata + "\\Folder";

if (CreateDirectory(appdata.c_str(), nullptr) == FALSE)
{
    // Handle error
}

【讨论】:

  • 谢谢!现在代码将编译,它得到 %appdata% 并很好地连接它,你只是在 appdata.c_str() 中弄错了,它的文件夹不是 appdata! :P
【解决方案2】:

一般情况下,你需要包含 Strsafe.h 才能使用 StringCchCat

http://msdn.microsoft.com/en-us/library/windows/desktop/ms647518(v=vs.85).aspx

以您的方式使用 StringCchCat 的问题是源缓冲区 (appdata) 可能不足以容纳 appdaa 和文件夹。您可以通过将 LPCSTR 转换为 std::string 并将字符串添加在一起(参见 How do I convert from LPCTSTR to std::string? ),然后在需要 const char* 时调用 string.c_str() 来让自己的生活更轻松。

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多