如何将字符串附加到 argv
How to append a string to a argv
我想删除一个文件,该文件的名称作为参数提供给程序;但是,由于文件类型将保持不变 (.bat),我希望它由程序自动给出(例如 运行 deletefile.exe script
将删除“script.bat”(在同一个目录))。我看到了 this 个问题,但解决方案似乎不起作用。
我是不是误解了什么?
我的尝试如下:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char *argv[]){
if(argv[1] == string("del")){
string file_to_remove;
file_to_remove = argv[2]+".bat";
if (remove(file_to_remove.c_str()) != 0){
cout<<"Error in file deletion.\n";
}
else {
cout<<"Removed alias " << argv[2] << "\n";
}
}
return 0;
}
但这会导致编译器错误
<source>: In function 'int main(int, char**)':
<source>:12:33: error: invalid operands of types 'char*' and 'const char [5]' to binary 'operator+'
12 | file_to_remove = argv[2]+".bat";
| ~~~~~~~^~~~~~~
| | |
| | const char [5]
| char*
file_to_remove = argv[2]+".bat";
语句的右侧试图使用 +
运算符连接两个 char*
字符串;您不能这样做,并且至少必须将其中一个操作数制成 std::string
.
你可以通过构造一个临时的 std:string
来做到这一点,就像这样:
file_to_remove = string(argv[2]) + ".bat";
或者,更简洁(自 C++14 起),通过将 s
suffix 添加到字符串文字:
file_to_remove = argv[2] + ".bat"s;
Don’t写using namespace std;
.
但是,您可以在 CPP 文件(而非 H 文件)或函数内部放置单个 using std::string;
等(参见 SF.7。)
Adrian 之前的回答已经解释了您对 +
的使用无效,因为它还不是 string
。但是,您还在没有初始化程序的一行上声明了变量,并在下一行进行了赋值。您应该在声明变量时对其进行初始化。所以,写成这样会很简单:
string file_to_remove = argv[2];
file_to_remove = += ".bat";
但是,注意有一种类型是specifically for file names!
std::filesystem::path file_to_remove = argv[2];
file_to_remove.replace_extension (".bat");
这样更好,因为它可以感知已经存在的扩展名并更改它,并提供其他形式的文件名操作。
if (remove(file_to_remove.c_str()) != 0){
同样,还有 filesystem::remove 这是一个 C++ 函数, 接受 path
对象 而不是需要生成 C 风格的字符串,成功直接returnstrue
std::error_code ec;
if (std::filesystem::remove(file_to_remove)) cout << "File removed\n";
else cout << "error was " << ec.message() << "\n";
您可以看到,这样也可以轻松获得详细说明实际错误的可读消息。
我想删除一个文件,该文件的名称作为参数提供给程序;但是,由于文件类型将保持不变 (.bat),我希望它由程序自动给出(例如 运行 deletefile.exe script
将删除“script.bat”(在同一个目录))。我看到了 this 个问题,但解决方案似乎不起作用。
我是不是误解了什么?
我的尝试如下:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char *argv[]){
if(argv[1] == string("del")){
string file_to_remove;
file_to_remove = argv[2]+".bat";
if (remove(file_to_remove.c_str()) != 0){
cout<<"Error in file deletion.\n";
}
else {
cout<<"Removed alias " << argv[2] << "\n";
}
}
return 0;
}
但这会导致编译器错误
<source>: In function 'int main(int, char**)':
<source>:12:33: error: invalid operands of types 'char*' and 'const char [5]' to binary 'operator+'
12 | file_to_remove = argv[2]+".bat";
| ~~~~~~~^~~~~~~
| | |
| | const char [5]
| char*
file_to_remove = argv[2]+".bat";
语句的右侧试图使用 +
运算符连接两个 char*
字符串;您不能这样做,并且至少必须将其中一个操作数制成 std::string
.
你可以通过构造一个临时的 std:string
来做到这一点,就像这样:
file_to_remove = string(argv[2]) + ".bat";
或者,更简洁(自 C++14 起),通过将 s
suffix 添加到字符串文字:
file_to_remove = argv[2] + ".bat"s;
Don’t写using namespace std;
.
但是,您可以在 CPP 文件(而非 H 文件)或函数内部放置单个 using std::string;
等(参见 SF.7。)
Adrian 之前的回答已经解释了您对 +
的使用无效,因为它还不是 string
。但是,您还在没有初始化程序的一行上声明了变量,并在下一行进行了赋值。您应该在声明变量时对其进行初始化。所以,写成这样会很简单:
string file_to_remove = argv[2];
file_to_remove = += ".bat";
但是,注意有一种类型是specifically for file names!
std::filesystem::path file_to_remove = argv[2];
file_to_remove.replace_extension (".bat");
这样更好,因为它可以感知已经存在的扩展名并更改它,并提供其他形式的文件名操作。
if (remove(file_to_remove.c_str()) != 0){
同样,还有 filesystem::remove 这是一个 C++ 函数, 接受 path
对象 而不是需要生成 C 风格的字符串,成功直接returnstrue
std::error_code ec;
if (std::filesystem::remove(file_to_remove)) cout << "File removed\n";
else cout << "error was " << ec.message() << "\n";
您可以看到,这样也可以轻松获得详细说明实际错误的可读消息。