【问题标题】:Char arrays and if statement syntaxChar 数组和 if 语句语法
【发布时间】:2013-03-21 05:37:08
【问题描述】:

我对 char 数组和 if 语句有疑问。

我尝试做:

void Motors::manualMotion(int CycleDutyAzim,int CycleDutyPitch,char directionAzim[],char directionPitch[]){


    setCycleDutyA(CycleDutyAzim);
    setCycleDutyP(CycleDutyPitch);

    if(directionAzim=="FORW"){
        moveForwAzim();
    }else if(directionAzim=="BACK"){
        moveBackAzim();
    }else{
        Serial.println("FAIL");
        handbreakAzim();
    }

    if(directionPitch=="FORW"){
        moveForwPitch();
    }else if(directionPitch=="BACK"){
        moveBackPitch();
    }else{
        Serial.println("FAILED");
        handbreakPitch();
    }
}

我总是收到带有消息的serial.prints。我让它在 char 而不是数组上工作。为了正常工作的语法是什么。当我调用该方法时,我给出了这个:

Motors::manualMotion(90,50,"FORW","BACK");

它不起作用。当我使用像 F 和 B 这样的一个字符时,它可以正常工作。

【问题讨论】:

  • 我也用过""的'''
  • CC++,不能同时使用。请选择!

标签: c++ c optimization arduino


【解决方案1】:

因为你不能用==比较C风格的字符串,你应该使用strcmp

但是 arduino 没有 STL,而是 there is a port,那么你可以享受 STL。另一种方法是使用std::string 而不是C 风格的字符串。

void Motors::manualMotion(int CycleDutyAzim,int CycleDutyPitch,
const std::string &directionAzim, const std::string &directionPitch) { // ...

【讨论】:

  • Arduino 编译器 (avr-gcc) 没有任何可用的 STL。
  • @MatthewMurdoch:是的,你是对的,但是移植 STL 需要付出一些努力here
【解决方案2】:
if (directionPitch == "FORW")

您不能使用== 来比较字符串。

当您将数组传递给函数时,它会衰减为指向其第一个元素的指针。当您使用== 进行比较时,它只会将指针的地址与字符串文字“FORW”的地址进行比较。这显然不是你想要做的。您想要的是将字符串文字与指针指向的内容进行比较。

如果你需要比较 c 风格的字符串,你需要strcmp

另一方面,为什么在 C++ 中使用 char [] 而不是 std::string?它为您省去了手动内存管理的所有问题,您可以简单地使用==进行字符串对象比较。

【讨论】:

  • 不,你不能使用strcpy
  • @Nim:这显然是一个错字。
【解决方案3】:

C/C++ char * == 不符合您的想法,请改用 strcmp/stricmp/strncmp 等。别担心,常见的错误,尤其是如果您习惯于具有固有字符串类型的语言。

另外,您可以考虑枚举类型而不是传递字符串。

【讨论】:

    【解决方案4】:

    if (variable == value) 只能用于比较简单类型、字符、整数。 字符数组不是简单的类型,因此您需要一个函数来进行比较。 strcmpstricmp 将为您工作。

    【讨论】:

      【解决方案5】:

      您应该使用字符串比较。数组比较不以这种方式存在。 C++ 不会仅仅因为 char 数组 通常 是一个以空字符结尾的字符串,就进行以空字符结尾的字符串比较。 char[] 不会像int[] 那样在这件事上得到特殊待遇。

      要么使用std::string 之类的字符串类,要么使用strcmp

      【讨论】:

        【解决方案6】:

        这不是你比较 C 风格字符串的方式,你应该使用 strcmp() 或类似的。当你这样做时

        directionAzim=="FORW"
        

        您正在比较指针

        char directionAzim[]
        

        在你的原型中也可以写成:

        char *directionAzim
        

        "FORW" 的类型为const char *。所以,如果你通过了:

        Motors::manualMotion(90,50,"FORW","BACK");
        

        这是不安全,因为没有什么可以阻止函数尝试更改文字(这可能会使您的程序崩溃)。你的原型应该是这样的:

        void Motors::manualMotion(int CycleDutyAzim,int CycleDutyPitch,
           const char directionAzim[], const char directionPitch[]);
        

        【讨论】:

          猜你喜欢
          • 2016-07-14
          • 1970-01-01
          • 2014-01-02
          • 2015-07-24
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          • 2016-03-02
          • 2016-02-29
          相关资源
          最近更新 更多