[英]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)
只能用于比较简单类型,字符,整数。 字符数组不是简单的类型,因此您需要一个函数来进行比较。 strcmp
或stricmp
将为您工作。
这不是比较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[]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.