0

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

4

6 回答 6

4
if (directionPitch == "FORW")

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

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

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

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

于 2013-03-20T14:43:55.937 回答
4

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

然而arduino没有STLs,但是有一个port,那么你就可以享受STLs了。另一种方法是使用std::string而不是 C 风格的字符串。

void Motors::manualMotion(int CycleDutyAzim,int CycleDutyPitch,
const std::string &directionAzim, const std::string &directionPitch) { // ...
于 2013-03-20T14:44:27.327 回答
1

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

此外,您可能会考虑枚举类型而不是传递字符串。

于 2013-03-20T14:44:36.090 回答
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[]);
于 2013-03-20T14:47:08.013 回答
0

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

要么使用像std::string这样的字符串类,要么使用strcmp

于 2013-03-20T14:47:58.140 回答
0

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

于 2013-03-20T14:46:54.473 回答