Je suis assez nouveau sur cpp et j'essaye de faire un projet. Il dit que le code doit prendre un nom de fichier en argument et sera exécuté par:
./main -i filename
J'ai écrit une boucle for qui va parcourir la liste des arguments pour trouver l'argument "-i" afin de pouvoir déterminer le nom du fichier. Mais cette ligne retourne toujours false:
argv[i] == "-i"
Ci-dessous mon 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;
}
argv[i] == "-i"
Dans la ligne ci-dessus, vous comparez deux pointeurs: char*
et const char*
, respectivement.
En d’autres termes, au lieu de comparer argv[i]
et "-i"
, deux pointeurs sont comparés et il est peu probable qu’il pointe vers le même emplacement. En conséquence, le chèque ne fonctionne pas dans votre cas.
Vous pouvez résoudre le problème de plusieurs manières, par exemple en incorporant "-i"
dans std::string
pour que la comparaison fonctionne correctement:
const auto arg = std::string{ "-i" };
for(int i = 0; i < argc; i++){
if(argv[i] == arg){
test = argv[i+1];
break;
}
}
À partir de C++ 17, vous pouvez également utiliser un std::string_view
:
const std::string_view sv{ "-i" };
for(int i = 0; i < argc; i++){
if(argv[i] == sv){
test = argv[i+1];
break;
}
}
ce qui est préférable car cela évite la création de std::string
.
Vous ne pouvez pas comparer les pointeurs à char
aux littéraux de chaîne (char const*
) à l'aide de ==
. Utilisez std::strcmp()
(<cstring>
) ou construisez un std::string
(<string>
) pour le rendre comparable à un char*
utilisant ==
.
essaye ça:
#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;
}