wake-up-neo.net

Entspricht in C++ dem Wert false

Ich bin ziemlich neu bei cpp und versuche ein Projekt zu machen. Es besagt, dass der Code einen Dateinamen als Argument enthalten muss und ausgeführt wird von:

./main -i filename

Ich habe eine for-Schleife geschrieben, die die Liste der Argumente durchläuft, um das Argument "-i" zu finden, damit ich den Dateinamen ermitteln kann. Diese Zeile gibt jedoch immer false zurück:

argv[i] == "-i"

Unten ist mein Code: 

#include <string>
#include <iostream>

int main(int argc, char *argv[]) {
    std::string test = argv[0];
    for(int i = 0; i < argc; i++){
        if(argv[i] == "-i"){
            test = argv[i+1];
            break;
        }
    }
    std::cout << test;
    return 1;
}
17
Arjun C
argv[i] == "-i"

In der Zeile darüber vergleichen Sie zwei Zeiger: char* und const char*.

Mit anderen Worten, anstatt argv[i] und "-i" zu vergleichen, werden zwei Zeiger verglichen, bei denen es sehr unwahrscheinlich ist, dass sie auf dieselbe Position zeigen. Daher funktioniert die Überprüfung in Ihrem Fall nicht.

Sie können das Problem auf verschiedene Weise beheben, beispielsweise "-i" in std::string einschließen, damit der Vergleich ordnungsgemäß funktioniert:

const auto arg = std::string{ "-i" };

for(int i = 0; i < argc; i++){
    if(argv[i] == arg){
        test = argv[i+1];
        break;
    }
}

Ab C++ 17 können Sie auch einen std::string_view verwenden:

const std::string_view sv{ "-i" };

for(int i = 0; i < argc; i++){
    if(argv[i] == sv){
        test = argv[i+1];
        break;
    }
}

dies ist ein bevorzugter Weg, da eine std::string-Erstellung vermieden wird.

24
Edgar Rokjān

Sie können Zeiger auf char nicht mit String-Literalen (char const*) vergleichen, indem Sie == verwenden. Verwenden Sie std::strcmp() (<cstring>) oder konstruieren Sie daraus einen std::string (<string>), um ihn mit char* mit == vergleichbar zu machen.

16
Swordfish

versuche dies:

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
    string test;
    for(int i = 0; i < argc; i++){        
        cout << "\n" << argv[i] << endl;
        if((string)argv[i] == "-i"){
            test = argv[i + 1];
            cout << "test= " << test << endl;
            break;
        }
    }
    cout << test << endl;
    system("pause");
    return 0;
}
0
Elbædry Jøba