gpt4 book ai didi

c++ - 为什么我的 token 返回 NULL,我该如何修复它?(c++)

转载 作者:行者123 更新时间:2023-11-30 04:39:03 25 4
gpt4 key购买 nike

我创建了一个程序来获取用户的字符串输入并将其解析为标记并根据输入移动机器人。该程序应该识别这些输入(其中 x 是一个整数):“向前 x”“向后 x”“向左转 x”“向右转 x”和“停止”。该程序对除“停止”之外的所有命令执行它应该执行的操作。当我输入“停止”时,程序会打印出“发生了什么事?”因为我写了一行:

if(token == NULL)
{
cout << "whats happening?" << endl;
}

为什么 token 会变成 NULL,我该如何解决这个问题才能正确读取“stop”?
这是代码:

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();
}

我需要它来跳出 while 循环并结束 manualDrive,因为在我的驱动程序中,下一个调用的函数是 autoDrive。
autodrive.txt 文件如下所示:

前锋2
右转30
返回 3
左转50
停止

此外,我在我的程序中遗漏了一个重要的限制,我不允许使用标准库中的字符串

最佳答案

代码行:

token=strtok(uinput, delim);

如果 uinput 为空或仅包含 delim 字符串中的字符,则将 token 设置为 NULL。

稍微更改 NULL 检查周围的代码可能会帮助您弄清楚发生了什么:

std::string original_uinput( uinput);  // save input string for debugging

token=strtok(uinput, delim);
if(token == NULL)
{
cout << "whats happening? uinput was: " << original_uinput << endl;
}

在任何情况下,NULL 都是 strtok() 的正常返回,您的代码需要准备好处理它。

关于c++ - 为什么我的 token 返回 NULL,我该如何修复它?(c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2634196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com