提问者:小点点

将char*连接到filesystem::path.filename()或char[260]时出现问题


我知道以前也有人问过类似的问题,但没有一个对我有帮助。

基本上,我需要dstpath=%AppData%+“当前EXE名称”

但问题在于不同的字符串类型和字符串拼接

简化代码:-

#include <stdio.h>
#include <string>
#include <filesystem>

#include <Shlwapi.h>
#include <Windows.h>

using namespace std;

int main()
{
    TCHAR selfPath[MAX_PATH];
    TCHAR dstPath[MAX_PATH];
    
    if (GetModuleFileName(NULL, selfPath, MAX_PATH) == 0)       // Getting exe File Location
        printf("Error : %ul\n", GetLastError());
    
    filesystem::path p(selfPath);
    
    dstPath = strcat(getenv("APPDATA"), p.filename().string().c_str());     // Here Comes The Error
    
    printf("Src : %s\n", selfPath);
    printf("Dst : %s\n", dstPath);
    
    return 0;
}

编译器命令:-

g++-os-s-o./builds/gcc-rat-x64.exe./source/rat.cpp-std=C++17-m64-lshlwapi

编译器错误:-

error: incompatible types in assignment of 'char*' to 'TCHAR [260]' {aka 'char [260]'}
   80 |  dstPath = strcat(getenv("APPDATA"), p.filename().string().c_str());

共1个答案

匿名用户

不能为数组赋值。您应该使用strcpy()复制C样式的字符串。

strcpy(dstPath, getenv("APPDATA"));
strcat(dstPath, p.filename().string().c_str());

或者可以通过snprintf()在一行中进行连接:

snprintf(dstPath, sizeof(dstPath), "%s%s", getenv("APPDATA"), p.filename().string().c_str());

最后,tchargetModuleFileName可以根据编译选项引用API的UNICODE版本。显式使用ANSI版本(charGetModuleFileNamea)与std::String和其他需要由char组成的字符串的API一起工作更安全。