如何将字符串附加到 argv

How to append a string to a argv

提问人:Gurnoor 提问时间:7/2/2021 最后编辑:463035818_is_not_an_aiGurnoor 更新时间:7/2/2021 访问量:464

问:

我想删除一个文件,其名称作为程序的参数给出;但是,由于文件类型将保持不变(.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*
C++ 文件 IOSTREAM

评论

2赞 Ruzihm 7/2/2021
这回答了你的问题吗?C++ 对二进制“operator+”类型“char*”和“const char [2]”的操作数无效
0赞 Adrian Mole 7/2/2021
@Ruzihm啊!我应该寻找重复的。Vs)。
0赞 Ruzihm 7/2/2021
@AdrianMole 不过,我确实喜欢你在下面的回答 - 如果这最终被关闭,你会把它复制到另一个问题吗?我也会在那里投赞成票
1赞 Adrian Mole 7/2/2021
@Ruzihm 实际上,我不完全确定其他问题是否重复。不过,这肯定是密切相关的。我没有投票结束,因为那将是一个铸造(锤子)投票。

答:

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
仅当通过文本命名空间启用后缀时,后缀才有效。susing
3赞 JDługosz 7/2/2021 #2

不要写.using namespace std;

但是,您可以在 CPP 文件(不是 H 文件)或函数中放置个人等(参见 SF.7using 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
看起来好多了;)