[英]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.