J’essaie d’exécuter une commande UNIX via mon programme qui gérera jusqu’à 4 arguments, pourquoi cela génère-t-il une erreur de segmentation ou d’autres erreurs?
using namespace std; int main() { char buffer[255]; cin >> buffer; char* firstPtr; char* secondPtr; char* thirdPtr; char* fourthPtr; firstPtr = strtok(buffer, " "); secondPtr = strtok(NULL, " "); thirdPtr = strtok(NULL, " "); fourthPtr = strtok(NULL, " "); execlp(firstPtr, secondPtr); return 0; }
Le crash est dû au fait que votre buffer
déborde.
Essayez d’utiliser std::cin.getline(buffer, sizeof(buffer))
au lieu de std::cin >> buffer
Notez également que strtok
peut renvoyer NULL
, alors assurez-vous de le gérer.
Je pense que vous devriez utiliser
char buffer[255]; cin.getline(buffer, 255);
Sinon, vos deuxième, troisième et quasortingème pointeurs seront vides.
Si vous vérifiez la page de execlp
de execlp
, vous remarquerez que le premier argument (le deuxième paramètre de la méthode, le paramètre arg0
) est obligatoire, en plus des autres parameters que vous pourriez transmettre à la fonction via des parameters variadic également mentionné dans le texte que
La liste des arguments doit être terminée par un pointeur NULL.
Le premier argument (secondPtr dans votre cas) doit être le nom de l’exécutable; donc vous violez la convention en passant ici NULL (à cause du cin >>
autres ont déjà souligné).
Mais en plus, il vous manque au moins un autre argument qui doit être NULL
.
Ainsi, une étude des pages de manuel est fortement recommandée!