我有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这样的一个字符时,它可以正常工作。
答案 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)
只能用于比较简单类型,字符,整数。
字符数组不是简单类型,因此您需要一个函数来进行比较。 strcmp
或stricmp
将为您效劳。
答案 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。