[请检查下面的最终编辑以获取更新]
我的C ++有点生疏(至少可以说),我在尝试将char数组传递给函数来操作值时遇到了问题。示例代码如下:
void myFunction(char* splitStrings,String stringToSetInLoop) {
char substringPtr[stringToSetInLoop.length()];
stringToSetInLoop.toCharArray(substringPtr, stringToSetInLoop.length());
for(int i = 0; i < 10; i++) {
splitStrings[i] = *substringPtr;
}
}
char *mySplitStrings[10];
myFunction(*mySplitStrings,String("Repeat Me"));
Serial.println(mySplitStrings[0]);
代码不会崩溃,但会输出一个空行。我怀疑我需要初始化函数外部的二维数组以传入,以便分配内存空间。我猜测,虽然子串指针存在于函数内部,但内存被破坏,char*
数组mySplitStrings[0
]指向任何东西。另外,我想我需要传入对数组内存空间的引用,而不是作为指针。
这里的最终目标是能够将char数组传递给函数,为其分配一些值,然后在主代码循环中使用这些值。如果有更好的方法来实现这一点,请告诉我。
提前致谢。请把我从我的个人指针/参考地狱中解放出来!
编辑:进一步注意,这段代码是在arduino上运行的,所以C ++是有限的。
编辑:当我尝试传入对char *指针的引用时,我收到此错误,我不确定如何更改要修复的函数参数:error:无法转换char* ()[10]
参数1到char
的{{1}}。任何人都可以试着向我展示一个有效的例子吗?
编辑:
感谢回复...我现在有一个工作的静态库函数,它将作为char *数组传递的字符串拆分。我知道它并不漂亮,但确实有效。谢谢你们的贡献。代码如下:
void myFunction(char*, String)
用法:
void ExplodeString::explode(char* explodeResults[], String str, String delimiter) {
int delimiterPosition;
int explodeResultsCounter=0;
String subString;
do {
delimiterPosition = str.indexOf(delimiter);
if(delimiterPosition != -1) {
subString = str.substring(0,delimiterPosition);
char *subStringPtr[subString.length()+1];
subString.toCharArray(*subStringPtr, subString.length()+1);
explodeResults[explodeResultsCounter++] = strdup(*subStringPtr);
str = str.substring(delimiterPosition+1, str.length());
} else { // here after the last delimiter is found
if(str.length() > 0) {
subString = str;
char *subStringLastPtr[subString.length()+1];
subString.toCharArray(*subStringLastPtr, subString.length()+1);
explodeResults[explodeResultsCounter++] = strdup(*subStringLastPtr);
}
}
} while (delimiterPosition >=0);
}
编辑:伙计,当你使用stdlib时,这要容易得多:
char* explodeResults[10];
ExplodeString::explode(explodeResults, String("cat:dog:chicken"), String(":"));
Serial.println(explodeResults[0]);
Serial.println(explodeResults[1]);
Serial.println(explodeResults[2]);
用法:
void ExplodeString::explode(std::vector<std::string> &explodeResults, std::string str, char delimiter) {
std::stringstream data(str);
std::string line;
while(std::getline(data,line,delimiter))
{
explodeResults.push_back(line);
}
}
答案 0 :(得分:2)
如何传递char *:
数组void myFunction(char* splitStrings[10], String stringToSetInLoop) {
// ...
char *mySplitStrings[10];
myFunction(mySplitStrings, String("Repeat Me"));
这也有效:
void myFunction(char* splitStrings[], String stringToSetInLoop) {
和此:
void myFunction(char** splitStrings, String stringToSetInLoop) {
此外,似乎avr平台有STL - 包含它,没有STL的C ++很奇怪。
答案 1 :(得分:1)
您没有为字符数组分配空间,只是传递字符数组的指针。 您可以使用具有足够空间的2d char数组来容纳最大长度字符串,而不是使用char * splitStrings [10]。假设您的最大字符串长度小于64,则可以执行此类操作。
char splitString[10][64];
void myFunction(char**splitStrings,String stringToSetInLoop)
or
void myFunction(char splitString[][64], String stringToSetInLoop)
{
int len = stringToSetInLoop.length();
for(int i = 0; i<10; i++)
{
for(int j = 0; i<len; j++)
{
splitString[i][j] = stringToSetInLoop.charAt(j);
}
}
}