我知道以前也有人问过类似的问题,但没有一个对我有帮助。
基本上,我需要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());
不能为数组赋值。您应该使用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());
最后,tchar
和getModuleFileName
可以根据编译选项引用API的UNICODE版本。显式使用ANSI版本(char
和GetModuleFileNamea
)与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