Char数组和if语句语法

Char arrays and if statement syntax

本文关键字:语句 语法 if 数组 Char      更新时间:2023-10-16

我对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();
    }
}

我总是收到带有消息的连载印刷品。我让它在char而不是数组上工作。语法是什么才能正常工作。当我调用方法时,我给出的是:

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

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

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

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

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

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

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

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

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

C/C++char * ==不会按照您的想法执行,而是使用strcmp/stricmp/strncmp等。别担心,这是一个常见的错误,尤其是当你习惯于使用固有字符串类型的语言时。

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

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

您应该使用字符串比较。数组比较不以这种方式存在。C++不会仅仅因为char数组通常是以null结尾的字符串就进行以null结尾字符串的比较。CCD_ 16在这件事上不会像CCD_ 17那样受到特殊对待。

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

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

directionAzim=="FORW"

您正在比较指针

char directionAzim[]

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

char *directionAzim

并且CCD_ 19是类型CCD_。所以,如果你正在通过:

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

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

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