如何在C中获取字符串的值?
我正在用C语言编程一个机器人,我遇到了一个我似乎无法解决的问题 解决这个问题的唯一方法是使用大量的如何在C中获取字符串的值?,c,string,goto,C,String,Goto,我正在用C语言编程一个机器人,我遇到了一个我似乎无法解决的问题 解决这个问题的唯一方法是使用大量的goto语句。 我正试图找出一种方法来避免自己写100多个goto点和语句以及if语句等,我想知道是否有一种方法可以转到字符串的值。比如说- string Next = "beginning"; goto Next; beginning: 是否有任何方法可以goto下一步的值,或者将Next的值替换到goto语句中 如果有办法做到这一点,那么我将能够为每个驾驶命令更改Next的值,然后goto无论
goto
语句。
我正试图找出一种方法来避免自己写100多个goto
点和语句以及if语句等,我想知道是否有一种方法可以转到字符串的值。比如说-
string Next = "beginning";
goto Next;
beginning:
是否有任何方法可以goto
下一步的值,或者将Next
的值替换到goto
语句中
如果有办法做到这一点,那么我将能够为每个驾驶命令更改Next
的值,然后goto
无论字符串Next
的值是什么
换言之,只需将字符串转换为goto
标识符,或将其替换为一个标识符即可
谢谢你的帮助
-编辑-
你们很多人都建议使用switch语句。我不确定这是否可行,因为我是如何编程的。程序的结构在这里--
顺便说一下,这段代码只包含了我实际拥有的一小部分,到目前为止,我真正的代码已经超过500行了。此外,驾驶指令也大大简化。但基本概念就在这里,比我所拥有的更容易理解
task main()
{
//integer list
int forwardDrivingSelector = 0;
int backwardDrivingSelector = 0;
int rightRotatingSelector = 0;
string nextCommand;
int waitTime = 0;
int countup = 0;
//driving commands
driveForward:
while(forwardDrivingSelector == 1)
{
motor[leftMotor] = 127;
motor[rightMotor] = 127;
countup++;
wait1Msec(1);
if(countup == waitTime)
{
countup = 0;
goto nextCommand;
}
}
driveBackward:
while(backwardDrivingSelector == 1)
{
motor[leftMotor] = -127;
motor[rightMotor] = 127;
countup++;
wait1Msec(1);
if(countup == waitTime)
{
countup = 0;
goto nextCommand;
}
}
rightRotate:
while(rightRotatingSelector == 1)
{
motor[leftMotor] = 127;
motor[rightMotor] = -127;
countup++;
wait1Msec(1);
if(countup == waitTime)
{
countup = 0;
goto nextCommand;
}
}
//autonomous driving code
//first command, drive forward for 1000 milliseconds
forwardDrivingSelector = 1;
nextCommand = "secondCommand";
waitTime = 1000;
goto driveForward;
secondCommand:
forwardDrivingSelector = 0;
//second command, rotate right for 600 milliseconds
rightRotatingSelector = 1;
nextCommand = "thirdCommand";
waitTime = 600;
goto rightRotate;
thirdCommand:
rightRotatingSelector = 0;
//third command, drive backwards for 750 milliseconds
backwardDrivingSelector = 1;
nextCommand = "end";
waitTime = 750;
goto driveBackward;
end:
backwardDrivingSelector = 0;
}
所以。这是怎么回事。
我有一个整数列表,包括驱动命令选择器、倒计时和等待时间整数,以及我刚才提到的字符串nextCommand。
接下来是驾驶指令。在我的真实代码中,我有大约30个命令,它们都连接到一个遥控器上,遥控器上有400多行,只用于驱动命令。
接下来是自治代码。我这样设置它的原因是,自治代码部分将是简单、简短、切中要害的。在向驱动代码中添加命令时,打开选择器,告诉nextCommand字符串下一个命令是什么,设置waitTime(它执行命令的时间,以毫秒为单位),然后让代码转到正在输入的驱动命令。驱动命令按您投入的时间驱动,然后转到下一个命令
如果有一种方法可以让goto语句将字符串“解释”为标识符,以便对其进行更改,那么理论上这一切都是可行的
我现在可以想到4种简单的方法来轻松解决这个问题,但它们会让代码变得非常冗长和混乱
现在你对我的问题有了更好的理解,还有什么意见吗?:)
顺便说一句,我正在使用一个名为robotC的程序,我正在为一个vex机器人编程。所以我必须使用普通,基本,C,我不能使用任何插件或任何东西。。。这是另一个原因,这是复杂的,因为我不能有多个类和类似的东西…你想得不对。您需要调用的每个操作都应该是一个函数,然后您可以通过检查“next”变量来选择下一步应该调用哪个函数 正如您所提到的,这可能是一个字符串,但您最好使用枚举类型来生成可读但更高效的代码 另一种方法(尽管可能有些过分)是确保您的函数都使用相同的参数和返回类型,然后使用函数指针跟踪下一步应该执行哪段代码
小提示:如果您曾经认为需要不止一个goto语句来实现某个目标,那么您可能没有找到最佳解决方案。作为C语言的扩展,GCC提供了一个名为的功能,它允许您在运行时计算一个标签。但是,我强烈建议您重新考虑您的设计
<>使用一百个标签(这将很容易导致不可维护的意大利面代码),而不是使用函数指针,而不是使用<代码> Gotos < /code >。代码将更加结构化和易于维护。我将调用100个函数中的一个,而不是goto函数。虽然C无法为您处理从字符串到函数的转换,但使用结构的排序数组非常容易:
struct fn {
char name[whatever];
void (*func)(void);
};
然后(例如)对数组进行二进制搜索,以找到与字符串匹配的函数
还注意到,许多实际系统提供了诸如“代码> GETPROCELATION/COD>(Windows)或<代码> DLSYM(UNIX/Linux)来处理您的一些工作。
您需要退后一步,并考虑其他解决方案来解决您正试图解决的问题。其中一个可能是这样的:
void DoSomething() {
printf("Something\n");
}
void DoSomethingElse() {
printf("Something else\n");
}
void (*nextStep)(void) = NULL;
nextStep = DoSomething;
nextStep();
nextStep = DoSomethingElse;
nextStep();
首先,让我先同意大家的意见:这可能不是你想要做的事情的正确方式。特别是,我认为您可能需要一个有限状态机,我建议您提供如何实现这一点的指导 也就是说。您可以使用
开关
语句或多或少地执行此操作。例如:
Next = BEGINNING;
HelperLabel:
switch(Next)
{
case BEGINNING:
.
.
.
Next = CONTINUING;
goto HelperLabel;
case ENDING:
.
.
.
break;
case CONTINUING:
.
.
.
Next = ENDING;
goto HelperLabel;
}
(请注意,switch
语句需要整数或类似整数的值,而不是字符串,但您可以使用enum
直接创建这些整数。)
有关使用
开关
/案例
作为转到
开关的原始规范示例,请参见?使用int/enum/which或检查字符串的值(例如,在其上循环并strcmp
)来确定目标
const char *dsts[n_dsts] = {"beginning","middle",...};
...
int i;
for(i = 0; i < n_dsts; i++) if(strcmp(dsts[i]) == 0) break;
switch(i) {
case 0: // whatever
case 1: // whatever
...
break;
default: // Error, dest not found
}
const char*dsts[n_dsts]={“开始”、“中间”、…};
...
int i;
对于(i=0;i
必须有一种比100个goto更好的方法来做你正在做的事情……如果你能描述根本问题,有人可能会找到一种比这些goto
s更好的方法
#define GOTO_HELPER(str, label) \
if (strcmp(str, #label) == 0) goto label;
#define GOTO(str) do { \
GOTO_HELPER(str, beginning) \
GOTO_HELPER(str, end) \
} while (0)
int main (int argc, char ** argv) {
GOTO("end");
beginning:
return 1;
end:
return 0;
}