提问人:Gurnoor 提问时间:7/2/2021 最后编辑:463035818_is_not_an_aiGurnoor 更新时间:7/2/2021 访问量:464
如何将字符串附加到 argv
How to append a string to a argv
问:
我想删除一个文件,其名称作为程序的参数给出;但是,由于文件类型将保持不变(.bat),我希望程序自动给出它(例如,运行将删除“script.bat”(位于同一目录中))。我已经看到了这个问题,但解决方案似乎不起作用。deletefile.exe script
我在这里误解了什么吗?
我的尝试如下:
#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*
答:
3赞
Adrian Mole
7/2/2021
#1
语句的右侧尝试使用运算符连接两个字符串;你不能这样做,并且必须至少将一个操作数变成 .file_to_remove = argv[2]+".bat";
char*
+
std::string
你可以通过构造一个临时的 来做到这一点,如下所示:std:string
file_to_remove = string(argv[2]) + ".bat";
或者,更简洁地说(从 C++14 开始),通过将 s
后缀添加到字符串文本中:
file_to_remove = argv[2] + ".bat"s;
评论
0赞
JDługosz
7/2/2021
仅当通过文本命名空间启用后缀时,后缀才有效。s
using
3赞
JDługosz
7/2/2021
#2
不要写.using namespace std;
但是,您可以在 CPP 文件(不是 H 文件)或函数中放置个人等(参见 SF.7。using std::string;
Adrian 之前的回答已经解释说,你的使用不起作用,因为它还没有。但是,您还在一行上声明了变量,没有初始值设定项,并在下一行分配了变量。在声明变量时,应初始化变量。因此,将其写成以下内容很简单:+
string
string file_to_remove = argv[2];
file_to_remove = += ".bat";
但是,请注意,有一种类型专门用于文件名!
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++ 函数,它采用路径
对象,而不需要生成 C 样式的字符串,如果成功,则直接返回。true
std::error_code ec;
if (std::filesystem::remove(file_to_remove)) cout << "File removed\n";
else cout << "error was " << ec.message() << "\n";
您可以看到,这也可以很容易地获得详细说明实际错误的可读消息。
评论
0赞
JDługosz
7/2/2021
@463035818_is_not_a_number我从另一个答案粘贴了它,其中每个主题都是一个单独的断点。
0赞
463035818_is_not_an_ai
7/2/2021
看起来好多了;)
评论