J'ai créé un programme pour obtenir une entrée de chaîne d'un utilisateur et l'analyser en jetons et déplacer un robot en fonction de l'entrée. Le programme est censé reconnaître ces entrées (où x est un entier): "forward x" "back x" "tourner à gauche x" "tourner à droite x" et "stop". Le programme fait ce qu'il est censé faire pour toutes les commandes sauf "stop". Quand je tape "stop", le programme imprime "Qu'est-ce qui se passe?" parce que j'ai écrit une ligne qui indique:Pourquoi mon jeton retourne-t-il NULL et comment puis-je le réparer? (C++)
if(token == NULL)
{
cout << "whats happening?" << endl;
}
Pourquoi NULL get jeton, et comment puis-je résoudre ce problème il va lire « arrêter » correctement?
Voici le code:
bool stopper = 0;
void Navigator::manualDrive()
{
VideoStream video(&myRobot, 0);//allows user to see what robot sees
video.startStream();
const int bufSize = 42;
char uinput[bufSize];
char delim[] = " ";
char *token;
while(stopper == 0)
{
cout << "Enter your directions below: " << endl;
cin.getline(uinput,bufSize);
Navigator::parseInstruction(uinput);
}
}
/* parseInstruction(char *c) -- parses cstring instructions received
* and moves robot accordingly
*/
void Navigator::parseInstruction(char * uinput)
{
char delim[] = " ";
char *token;
// cout << "Enter your directions below: " << endl;
// cin.getline (uinput, bufSize);
token=strtok(uinput, delim);
if(token == NULL)
{
cout << "whats happening?" << endl;
}
if(strcmp("forward", token) == 0)
{
int inches;
token = strtok(NULL, delim);
inches = atoi (token);
double value = fabs(0.0735 * fabs(inches) - 0.0550);
myRobot.forward(1, value);
}
else if(strcmp("back",token) == 0)
{
int inches;
token = strtok(NULL, delim);
inches = atoi (token);
double value = fabs(0.0735 * fabs(inches) - 0.0550);
myRobot.backward(1/*speed*/, value/*time*/);
}
else if(strcmp("turn",token) == 0)
{
int degrees;
token = strtok(NULL, delim);
if(strcmp("left",token) == 0)
{
token = strtok(uinput, delim);
degrees = atoi (token);
double value = fabs(0.00467 * degrees - 0.04);
myRobot.turnLeft(1/*speed*/, value/*time*/);
}
else if(strcmp("right",token) == 0)
{
token = strtok(uinput, delim);
degrees = atoi (token);
double value = fabs(0.00467 * degrees - 0.04);
myRobot.turnRight(1/*speed*/, value/*time*/);
}
}
else if(strcmp("stop",token) == 0)
{
stopper = 1;
}
else
{
std::cerr << "Unknown command '" << token << "'\n";
}
}
/* autoDrive() -- reads in file from ifstream, parses
* and moves robot according to instructions in file
*/
void Navigator::autoDrive(string filename)
{
const int bufSize = 42;
char fLine[bufSize];
ifstream infile;
infile.open("autodrive.txt", fstream::in);
while (!infile.eof())
{
infile.getline(fLine, bufSize);
Navigator::parseInstruction(fLine);
}
infile.close();
}
Je en ai besoin pour sortir de la boucle while et fin manualDrive parce que dans mon programme pilote la fonction suivante appelée est AUTODRIVE.
le fichier autodrive.txt ressemble:
avant 2
tourner à droite 30
arrière 3
tourner à gauche 50
arrêt
Aussi je reste sur une limitation importante de mon programme je Je ne suis pas autorisé à utiliser la chaîne de la bibliothèque standard
poster un échantillon de ce qui est dans autodrive.txt qui donne le mauvais comportement –
Je présume le programme segfaults immédiatement après l'impression "ce qui se passe?" parce qu'il passe NULL à strcmp? Sinon, cherchez quelque part ailleurs dans le programme quelque part qui imprime également "ce qui se passe?". Est-il possible que ça passe en mode "autodrive" et qu'il y ait une ligne vide quelque part dans le fichier? –
Désolé pour l'imprécision. Non, ça ne va pas à AutoDrive. Zh: erreur de segmentation (core dumped) ./driver " J'ai exécuté autoDrive séparément et je reçois un défaut de segmentation sur la dernière ligne de texte qui se lit" stop "Je vais éditer mon poste avec un exemple de ce à quoi ressemble le fichier texte. – Van