如何在C中获取字符串的值?

如何在C中获取字符串的值?,c,string,goto,C,String,Goto,我正在用C语言编程一个机器人,我遇到了一个我似乎无法解决的问题 解决这个问题的唯一方法是使用大量的goto语句。 我正试图找出一种方法来避免自己写100多个goto点和语句以及if语句等,我想知道是否有一种方法可以转到字符串的值。比如说- string Next = "beginning"; goto Next; beginning: 是否有任何方法可以goto下一步的值,或者将Next的值替换到goto语句中 如果有办法做到这一点,那么我将能够为每个驾驶命令更改Next的值,然后goto无论

我正在用C语言编程一个机器人,我遇到了一个我似乎无法解决的问题

解决这个问题的唯一方法是使用大量的
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;
}