C++ bool 行为不符合预期 [重复]

C++ bool behaviours not as expected [duplicate]

提问人:KoLaR666 提问时间:6/1/2021 最后编辑:Vlad from MoscowKoLaR666 更新时间:6/1/2021 访问量:96

问:

我在C++中的反转布尔值有一些奇怪的问题。:') 我想检查传递给主方法的参数是否不是“file.txt”。如果不是,我想创建以名称作为主要参数的新文件,并在那里写下随机数据行。否则我想从“file.txt”读取数据。 一切都如我所愿,但是当我输入终端时,程序将此随机数据输入“file.txt”而不是从中读取。 另一方面,当我输入时:它正在从“file.txt”读取。有什么想法吗?g++ sourcefile.cpp header.h./a.out file.txt ./a.out someRandomData.txt

    int main(int argc, char* argv[]) {
        if(argv[1] != "file.txt"){
            fileWithRandomData(argv[1]);    
        }
        else{

        std::vector<std::string> row;
        std::string line, word, temp;
        std::ifstream MyReadFile(argv[1]);
        (...)

这是我的 fileWithRandomData 功能的示例:

     void fileWithRandomData(string name){
        srand(time(NULL));
       
        std::ofstream MyFile(name);
        int metalsNumber = rand() % 5000 + 1;  //first line -> number of available metals.
        (...)
    
c++ 字符串比较 c-strings 布尔逻辑

评论

0赞 Algirdas Preidžius 6/1/2021
argv[1] != "file.txt"永远不会是假的。
0赞 smoothware 6/1/2021
您正在使用 C++?请直接将参数转换为 std::string_view 或 std::string,并始终确保您确实传递了您正在检查的参数(例如,不带参数的调用将是超出范围的访问)。更好的是,使用一个好的库来处理命令行接口:)

答:

0赞 Vlad from Moscow 6/1/2021 #1

您需要比较两个 C 字符串,而不是比较存储它们的地址。

那就是写

#include <cstring>

//...

if( strcmp( argv[1], "file.txt" ) != 0 ){

否则,在此 if 语句中

if(argv[1] != "file.txt"){

比较了两个指针:和指向字符串文本的第一个字符的指针。argv[1]"file.txt"

由于字符串占用的内存范围不同,因此 if 语句的条件将始终计算为 true。