努力将LPSTR和字符串添加到LPCTSTR 运算符来连接C字符串。或者走C路径,使用 STRCAT< /COD>(1)和朋友,或者走C++路径,用 STD::String < /Cord>替换所有 char */Cult> s,并与之一起工作。 选择两条道路中的一条,然后阅读教程 char */COD> -C中的字符串或代码> STD::Ctry在C++中。

努力将LPSTR和字符串添加到LPCTSTR 运算符来连接C字符串。或者走C路径,使用 STRCAT< /COD>(1)和朋友,或者走C++路径,用 STD::String < /Cord>替换所有 char */Cult> s,并与之一起工作。 选择两条道路中的一条,然后阅读教程 char */COD> -C中的字符串或代码> STD::Ctry在C++中。,c++,string,windows,C++,String,Windows,我的目的是使用并将文件复制/粘贴到新文件中 这是我的密码: #include <iostream> #include <stdlib.h> #include <stdio.h> #include <windows.h> #include <winbase.h> using namespace std; #define DR drum- #define NO normal- #define SO soft- //main in

我的目的是使用并将文件复制/粘贴到新文件中

这是我的密码:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <winbase.h>


using namespace std;


#define DR drum-
#define NO normal-
#define SO soft-


//main
int main(){
LPCTSTR input;
LPCTSTR output;
LPSTR cd;
LPCSTR src = "source.wav";



if(GetCurrentDirectoryA(strlen(cd), cd)){
    input =  (LPCTSTR)cd + (LPCTSTR)src;


    if(CopyFileA(input, cd + "DR" + "hitclap.wav"))
        cout<<"done"<<endl;
    else
        cout<<"error"<<endl;
}
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义DR鼓-
#定义不正常-
#定义如此柔软-
//主要
int main(){
LPCTSTR输入;
LPCTSTR输出;
LPSTR-cd;
LPCSTR src=“source.wav”;
if(GetCurrentDirectoryA(strlen(cd),cd)){
输入=(LPCTSTR)cd+(LPCTSTR)src;
if(CopyFileA(输入,cd+“DR”+“hitclap.wav”))

coutAPI
GetCurrentDirectory
不会向您返回新字符串。它所做的是向它传递一个内存位置,并用当前目录字符串填充该内存位置

问题是你没有分配内存,你给它传递了一个未初始化的
char*
LPSTR
),
cd
。你也在这个未初始化的字符指针上使用
strlen
。通常,你使用一个长度为
MAX\u PATH
的字符数组来播放文件名:

char cd[MAX_PATH];

GetCurrentDirectoryA(sizeof(cd), cd);
第二个注释是,不能使用<代码> +//>运算符来连接C字符串。或者走C路径,使用<代码> STRCAT< /COD>(1)和朋友,或者走C++路径,用<代码> STD::String < /Cord>替换所有<代码> char */Cult> s,并与之一起工作。

选择两条道路中的一条,然后阅读教程 char */COD> -C中的字符串或代码> STD::Ctry在C++中。

要正确理解
LPTSTR
类型及其与
LPSTR
的关系,请参阅我创建的


[1]

API
GetCurrentDirectory
不会向您返回新字符串。它所做的是向它传递一个内存位置,并用当前目录字符串填充该内存位置

问题是你没有分配内存,你给它传递了一个未初始化的
char*
LPSTR
),
cd
。你也在这个未初始化的字符指针上使用
strlen
。通常,你使用一个长度为
MAX\u PATH
的字符数组来播放文件名:

char cd[MAX_PATH];

GetCurrentDirectoryA(sizeof(cd), cd);
第二个注释是,不能使用<代码> +//>运算符来连接C字符串。或者走C路径,使用<代码> STRCAT< /COD>(1)和朋友,或者走C++路径,用<代码> STD::String < /Cord>替换所有<代码> char */Cult> s,并与之一起工作。

选择两条道路中的一条,然后阅读教程 char */COD> -C中的字符串或代码> STD::Ctry在C++中。

要正确理解
LPTSTR
类型及其与
LPSTR
的关系,请参阅我创建的


[1]

每当我使用接受或使用LPSTR/LPCTSTR的东西时,我倾向于使用std::wstring:

std::wstring input = _T("");
input.append(_T("Sample Text"));
input.append(std::to_wstring(myint));
std::copy(mystring.begin(), mystring.end(), text.end());
这使得使用字符串代替LPCTSTR成为可能。我不知道它在这种情况下是否有效,但我认为它会


编辑:正如@MicroVirus所说的,你真的应该尽一切努力使用TCHAR,这样你的程序就可以同时兼容ANSI和Unicode(你的函数使用ANSI,用尾随的“A”表示)。

每当我使用接受或使用LPSTR/LPCTSTR的东西时,我倾向于使用std::wstring来代替:

std::wstring input = _T("");
input.append(_T("Sample Text"));
input.append(std::to_wstring(myint));
std::copy(mystring.begin(), mystring.end(), text.end());
这使得使用字符串代替LPCTSTR成为可能。我不知道它在这种情况下是否有效,但我认为它会

编辑:正如@MicroVirus所说,你真的应该全力以赴地使用TCHAR,这样你的程序就可以兼容ANSI和Unicode(你的函数使用ANSI,后面的“A”表示)。

is的签名

lpBuffer
是指向应将内容放置在其中的内存缓冲区的指针,nBufferLength是此内存区域的大小(以TCHARs为单位)

因此正确的代码应该是:

TCHAR szBuffer[MAX_PATH];
GetCurrentDirectory(MAX_PATH, szBuffer);
您必须使用TCHAR,因为对于非unicode构建,它将解析为char,对于unicode构建,它将是wchar。\n

lpBuffer
是指向应将内容放置在其中的内存缓冲区的指针,nBufferLength是此内存区域的大小(以TCHARs为单位)

因此正确的代码应该是:

TCHAR szBuffer[MAX_PATH];
GetCurrentDirectory(MAX_PATH, szBuffer);

您必须使用TCHAR,因为对于非unicode构建,它将解析为char,对于unicode构建,它将是wchar\u t。

欢迎使用80286内存模型的传统,以及Windows操作系统使用的从8位字符到(某种)unicode的演变

LPCSTR的意思是:“指向常量字符串的长指针”,今天相当于
const char*
。不太多年前,它相当于
const char*far
——这是一个Microsoft扩展,它告诉编译器地址可能位于不同的内存段中(如果你真的在意,谷歌是你的朋友)“分段存储器型号80286”)

LPCTSTR表示:指向常量[宽或8位,取决于编译器标志]字符的长指针。例如:
const char*
const wchar\u t*
取决于构建模式

类似地,LPSTR今天是char*
,但从前是char*far


因此,您可以看到Windows API实际上使用了指向c样式字符串的原始指针,c样式字符串可以是常量或可变的,也可以是宽字符或8位字符,具体取决于上下文和构建选项。

欢迎使用80286内存模型的传统以及Windows操作系统使用的从8位字符到(某种)unicode的演变

LPCSTR的意思是:“指向常量字符串的长指针”,今天相当于
const char*
。不太多年前,它相当于
const char*far
——这是一个Microsoft扩展,它告诉编译器地址可能位于不同的内存段中(如果你真的在意,谷歌是你的朋友)分段存储器型号80286“

LPCTSTR平均值
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>

#include <windows.h>

using std::endl;
using std::cout;
using std::cerr;

using tstring = std::basic_string<TCHAR>;

const std::wstring dr = L"drum-";
// OR: const tstring dr = TEXT("drum-");
const std::wstring no = L"normal-";
const std::wstring so = L"soft-";
const std::wstring src = L"drum.wav";
const std::wstring dest = L"hitclap.wav";

int main()
{
   const std::vector<wchar_t>::size_type cd_buf_len = GetCurrentDirectoryW( 0, NULL );
   assert( cd_buf_len > 0 );
   std::vector<wchar_t> cwd( cd_buf_len, 0 );
   const DWORD cd_result = GetCurrentDirectoryW( cd_buf_len, cwd.data() );
   assert(cd_result);

   if (CopyFileW( (cwd.data() + src).c_str(), (cwd.data() + dr + dest).c_str(), FALSE )) {
       cout << "Done." << endl;
   } else {
       cerr << "Error." << endl;
       return EXIT_FAILURE;
   }

   return EXIT_SUCCESS;
}
constexpr wchar_t src[] = L"drum.wav";
/* … */
std::wstring src_path = cwd.data();
src_path += src;