Char数组和if语句语法

时间:2013-03-20 14:41:26

标签: c++ c optimization arduino

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

6 个答案:

答案 0 :(得分:4)

if (directionPitch == "FORW")

您无法使用==来比较字符串。

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

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

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

答案 1 :(得分:4)

由于您无法按==比较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) { // ...

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你应该使用字符串比较。以这种方式不存在数组比较。 C ++不会仅仅因为char数组 是一个以空字符结尾的字符串而进行以空字符结尾的字符串比较。 char[] int[]不会在此问题上获得特殊待遇。

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