当前位置: 首页 > 知识库问答 >
问题:

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

郗奇玮
2023-03-14

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

基本上,我需要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个答案

晏华奥
2023-03-14

不能为数组赋值。您应该使用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一起工作更安全。

 类似资料:
  • 描述 (Description) C库函数char *strtok(char *str, const char *delim)使用分隔符delim将字符串str分解为一系列标记。 声明 (Declaration) 以下是strtok()函数的声明。 char *strtok(char *str, const char *delim) 参数 (Parameters) str - 修改此字符串的内容

  • 描述 (Description) C库函数char *strcpy(char *dest, const char *src)将char *strcpy(char *dest, const char *src)指向的字符串复制到dest 。 声明 (Declaration) 以下是strcpy()函数的声明。 char *strcpy(char *dest, const char *src) 参数

  • 描述 (Description) C库函数char *strcat(char *dest, const char *src)将char *strcat(char *dest, const char *src)指向的字符串追加到dest指向的字符串的末尾。 声明 (Declaration) 以下是strcat()函数的声明。 char *strcat(char *dest, const char *

  • 描述 (Description) C库函数char *gets(char *str)从stdin读取一行并将其存储到str指向的字符串中。 当读取换行符或达到文件结尾时(以先到者为准),它会停止。 声明 (Declaration) 以下是gets()函数的声明。 char *gets(char *str) 参数 (Parameters) str - 这是指向存储C字符串的字符数组的指针。 返回值

  • 描述 (Description) C库函数char *tmpnam(char *str)生成并返回一个不存在的有效临时文件名。 如果str为null,则它只返回tmp文件名。 声明 (Declaration) 以下是tmpnam()函数的声明。 char *tmpnam(char *str) 参数 (Parameters) str - 这是指向字符数组的指针,其中建议的tempname将存储为C

  • char列表只不过是一个字符列表。 考虑以下程序来理解相同的内容。 IO.puts('Hello') IO.puts(is_list('Hello')) 上述程序产生以下结果 - Hello true char列表不包含字节,而是包含单引号之间字符的代码点。 So while the double-quotes represent a string (ie a binary), singleq