C++ 将 2 个字符串合并在一起
C++ Merge 2 Strings Together
我正在尝试创建一个简单的文本文件到桌面,但我在控制台中看到:“访问被拒绝。”。我从命令行做同样的事情,没有错误。如果我在哪里打印 path 我会得到:
“
C:/Users/Alex
(这里是一个新行)
/Desktop/MyTextFile.txt
我知道当我通过 += string 将一个字符串添加到另一个字符串时,我在2 串。任何帮助将不胜感激!
string getClip() {
HANDLE clip;
string clip_text = "";
if (OpenClipboard(NULL))
{
clip = GetClipboardData(CF_TEXT);
clip_text = (char*)clip;
CloseClipboard();
return clip_text;
}
}
string getUser() {
system("echo %username% | clip");
string user = getClip();
return user;
}
void create_a_simple_txt_file() {
string username = getUser();
ostringstream path;
path << "C:/Users/" << username << "/Desktop/MyTextFile.txt";
system(("echo I successful Write something to my file > " + path.str()).c_str());
}
int main() {
create_a_simple_txt_file();
cin.get();
return 0;
}
我敢打赌你的问题出在 getUser()
函数中,它返回带有尾随换行符的用户名,而不是字符串连接(顺便说一句,不添加 space ).
编辑问题后编辑:
如我所料,问题出在您的 getUser() 函数中,如果您在 Windows OS 上 运行,请参阅 "Some programmer dude" 回答错误原因和可能的解决方案.
另一个问题可能是您正在尝试访问另一个用户的桌面文件夹,而该用户运行您的程序没有权限。
另一个建议:您可能希望使用适当的 C++ 函数或 fstream 来写入文件,而不是使用 system()
。
问题是 system
和 echo
命令的用法:
system("echo %username% | clip");
echo
命令 添加 尾随换行符,使用 clip
命令将其复制到剪贴板,然后您将获得完整的字符串,包括getClip
.
的换行符
您可以完全不使用 system
来解决这个问题,而是使用 GetUserName
Windows API 函数获取用户名:
std::string getUser()
{
char username[64];
// Use the ASCII version of the function
if (GetUserNameA(username, sizeof username))
{
return username;
}
// An error
std::cerr << "Error getting username: " << GetLastError() << '\n';
return "";
}
您收到 访问被拒绝 错误,因为您正在处理垃圾数据。行
system(("echo I successful Write something to my file > " + path.str()).c_str());
创建一个临时字符串并获取指向其底层字符数组的指针。但是在执行 system()
调用之前,临时字符串被破坏并且指针变得无效。
如果您用 cout
替换您的系统调用,您可以看到您实际尝试执行的命令。对我来说,它类似于 Ó╣iwµ
,它既不是有效命令也不是有效目录名。因此,访问被拒绝。
要解决该问题,请将临时字符串分配给一个变量,直到您使用它为止:
string s = ("echo I successful Write something to my file > " + path.str());
system(s.c_str());
我正在尝试创建一个简单的文本文件到桌面,但我在控制台中看到:“访问被拒绝。”。我从命令行做同样的事情,没有错误。如果我在哪里打印 path 我会得到: “
C:/Users/Alex (这里是一个新行) /Desktop/MyTextFile.txt
我知道当我通过 += string 将一个字符串添加到另一个字符串时,我在2 串。任何帮助将不胜感激!
string getClip() {
HANDLE clip;
string clip_text = "";
if (OpenClipboard(NULL))
{
clip = GetClipboardData(CF_TEXT);
clip_text = (char*)clip;
CloseClipboard();
return clip_text;
}
}
string getUser() {
system("echo %username% | clip");
string user = getClip();
return user;
}
void create_a_simple_txt_file() {
string username = getUser();
ostringstream path;
path << "C:/Users/" << username << "/Desktop/MyTextFile.txt";
system(("echo I successful Write something to my file > " + path.str()).c_str());
}
int main() {
create_a_simple_txt_file();
cin.get();
return 0;
}
我敢打赌你的问题出在 getUser()
函数中,它返回带有尾随换行符的用户名,而不是字符串连接(顺便说一句,不添加 space ).
编辑问题后编辑:
如我所料,问题出在您的 getUser() 函数中,如果您在 Windows OS 上 运行,请参阅 "Some programmer dude" 回答错误原因和可能的解决方案.
另一个问题可能是您正在尝试访问另一个用户的桌面文件夹,而该用户运行您的程序没有权限。
另一个建议:您可能希望使用适当的 C++ 函数或 fstream 来写入文件,而不是使用 system()
。
问题是 system
和 echo
命令的用法:
system("echo %username% | clip");
echo
命令 添加 尾随换行符,使用 clip
命令将其复制到剪贴板,然后您将获得完整的字符串,包括getClip
.
您可以完全不使用 system
来解决这个问题,而是使用 GetUserName
Windows API 函数获取用户名:
std::string getUser()
{
char username[64];
// Use the ASCII version of the function
if (GetUserNameA(username, sizeof username))
{
return username;
}
// An error
std::cerr << "Error getting username: " << GetLastError() << '\n';
return "";
}
您收到 访问被拒绝 错误,因为您正在处理垃圾数据。行
system(("echo I successful Write something to my file > " + path.str()).c_str());
创建一个临时字符串并获取指向其底层字符数组的指针。但是在执行 system()
调用之前,临时字符串被破坏并且指针变得无效。
如果您用 cout
替换您的系统调用,您可以看到您实际尝试执行的命令。对我来说,它类似于 Ó╣iwµ
,它既不是有效命令也不是有效目录名。因此,访问被拒绝。
要解决该问题,请将临时字符串分配给一个变量,直到您使用它为止:
string s = ("echo I successful Write something to my file > " + path.str());
system(s.c_str());