如何将字符串附加到 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’tusing 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";

您可以看到,这样也可以轻松获得详细说明实际错误的可读消息。