繁体   English   中英

字符数组和if语句语法

[英]Char arrays and if statement syntax

我在使用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这样的字符时,它可以正常工作。

if (directionPitch == "FORW")

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

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

如果需要比较c样式的字符串,则需要strcmp

另一方面,为什么在C ++中仍然使用char []而不是std::string 它为您节省了手动内存管理的所有问题,您只需将==用于字符串对象比较即可。

因为您不能通过==比较C样式的字符串,所以应该使用strcmp

但是arduino还没有STL,但是有一个port ,那么您可以享受STL。 另一种方法是使用std::string而不是C样式的字符串。

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

C / C ++ char * ==不能满足您的要求,请改用strcmp/stricmp/strncmp等。 别担心,这是常见的错误,特别是如果您习惯于具有固有字符串类型的语言。

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

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

这不是比较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[]);

您应该使用字符串比较。 数组比较不存在这种方式。 C ++不会进行以null终止的字符串比较,只是因为char数组通常是一个以null终止的字符串。 char[]在此问题上不会比int[]受到特殊对待。

使用诸如std :: string之类的字符串类,或使用strcmp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM