c - 将字符串拆分为字符串数组

标签 c arrays string arduino

我一直在为 arduino 编程,但今天我遇到了一个问题,我用我非常有限的 C 知识无法解决。 事情是这样的。 我正在创建一个将串行输入发送到 arduino(设备 ID、命令、命令参数)的 pc 应用程序。这个 arduino 将通过 RF 将该命令传输到其他 arduino。根据设备 ID,正确的 arduino 将执行命令。

为了能够确定 deviceID,我想将该字符串拆分为“,”。 这是我的问题,我知道如何在 Java 中轻松地做到这一点(即使不使用标准的拆分函数),但是在 C 中它是一个完全不同的故事。

你们中的任何人都可以告诉我如何让它工作吗?

谢谢

/*
  Serial Event example

 When new serial data arrives, this sketch adds it to a String.
 When a newline is received, the loop prints the string and 
 clears it.

 A good test for this is to try it with a GPS receiver 
 that sends out NMEA 0183 sentences. 

 Created 9 May 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/SerialEvent

 */

String inputString;         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete
String[] receivedData;

void setup() {
    // initialize serial:
    Serial.begin(9600);
    // reserve 200 bytes for the inputString:
    inputString.reserve(200);
}

void loop() {
    // print the string when a newline arrives:
    if (stringComplete) {
        Serial.println(inputString); 
        // clear the string:
        inputString = "";
        stringComplete = false;
    }
}

/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
void serialEvent() {
    while (Serial.available()) {
        // get the new byte:
        char inChar = (char)Serial.read(); 
        if (inChar == '\n') {
            stringComplete = true;
        } 
        // add it to the inputString:
        if(stringComplete == false) {
            inputString += inChar;
        }
        // if the incoming character is a newline, set a flag
        // so the main loop can do something about it:
    }
}

String[] splitCommand(String text, char splitChar) {
    int splitCount = countSplitCharacters(text, splitChar);
    String returnValue[splitCount];
    int index = -1;
    int index2;

    for(int i = 0; i < splitCount - 1; i++) {
        index = text.indexOf(splitChar, index + 1);
        index2 = text.indexOf(splitChar, index + 1);

        if(index2 < 0) index2 = text.length() - 1;
        returnValue[i] = text.substring(index, index2);
    }

    return returnValue;
}

int countSplitCharacters(String text, char splitChar) {
    int returnValue = 0;
    int index = -1;

    while (index > -1) {
        index = text.indexOf(splitChar, index + 1);

        if(index > -1) returnValue+=1;
    }

    return returnValue;
} 

我决定使用 strtok 函数。 我现在遇到了另一个问题。发生的错误是

SerialEvent.cpp: In function 'void splitCommand(String, char)':

SerialEvent:68: error: cannot convert 'String' to 'char*' for argument '1' to 'char* strtok(char*, const char*)'

SerialEvent:68: error: 'null' was not declared in this scope

代码就像,

String inputString;         // a string to hold incoming data

void splitCommand(String text, char splitChar) {
    String temp;
    int index = -1;
    int index2;

    for(temp = strtok(text, splitChar); temp; temp = strtok(null, splitChar)) {
        Serial.println(temp);
    }

    for(int i = 0; i < 3; i++) {
        Serial.println(command[i]);
    }
}

最佳答案

这是一个老问题,但我已经创建了一些可能有帮助的代码:

 String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length()-1;

  for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
        found++;
        strIndex[0] = strIndex[1]+1;
        strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  }

  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

此函数返回由给定索引处的预定义字符分隔的单个字符串。例如:

String split = "hi this is a split test";
String word3 = getValue(split, ' ', 2);
Serial.println(word3);

应该打印"is"。您还可以尝试使用索引 0 返回“hi”或安全地尝试使用索引 5 返回“test”。

希望对您有所帮助!

关于c - 将字符串拆分为字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9072320/

相关文章:

c - 下面的表达式会输出什么,为什么?

c++ - InterlockedIncrement 与 InterlockedIncrementAcquire 与 InterlockedIncrementNoFence

python - `features[' contains(%s )' % word.lower()] = True` 在 NLTK 中是什么意思?

c - GoogleTest 在特定测试中强制 #undef

c - 确定数组(预定义数组)的奇数和偶数并将它们存储到 2 个单独的数组中

c - 使用数组创建单链表时的警告

java - 获取 ArrayList 元素平均值的最短形式

javascript - key未知时如何获取js对象的属性值

c++ - 基本字符串输入

c - 将字符串传递给函数