특정 구분자를 이용하여 문자열을 자르는 기능을 'Split'라고 합니다.
C++용 'Split'를 구현하는 내용은 많은데 아두이노에 바로 적용할 수 없어서 아두이노용으로 다시 만들었습니다.
스플릿을 구현하는 방법은 간단합니다.
1) 한 문자씩 검사를 한 다음
2) 구분용 문자가 나오면 잘라내고
3) 그 이후부터 다시 검사합니다.
이 과정을 반복하여 구분자를 잘라 냅니다.
문제는 언어마다 이 과정이 약간씩 다를 수 있다는 점입니다.
아두이노에서는 'indexOf'로 구분자의 위치를 찾은 다음 'substring'으로 문자열을 잘라내고 그 과정을 반복합니다.
이제 스플릿을 구현해 봅시다.
void Split(String sData, char cSeparator)
{
int nCount = 0;
int nGetIndex = 0 ;
//임시저장
String sTemp = "";
//원본 복사
String sCopy = sData;
while(true)
{
//구분자 찾기
nGetIndex = sCopy.indexOf(cSeparator);
//리턴된 인덱스가 있나?
if(-1 != nGetIndex)
{
//있다.
//데이터 넣고
sTemp = sCopy.substring(0, nGetIndex);
Serial.println( sTemp );
//뺀 데이터 만큼 잘라낸다.
sCopy = sCopy.substring(nGetIndex + 1);
}
else
{
//없으면 마무리 한다.
Serial.println( sCopy );
break;
}
//다음 문자로~
++nCount;
}
}
사용은
Split("[원본]", "[구분자]");
입니다.
(참고 : 스택오버플로 - Split String into String array)
원래를 구분자로 자른 데이터를 동적배열로 만들어서 리턴하려고 했는데.....
다른 분들이 만든 코드로 테스트했더니 아두이노가 죽는 현상이 있었습니다-_-;
그래서 리스트어레이(ListArray)를 구현할까 하다가 아두이노의 처리방식을 보면 '리스트어레이가 과연 효율적인가?'에 대한 의문이 있습니다.
어떻게 구현하여 사용하냐에 따라 오히려 리스트어레이보다는 배열의 크기를 고정하는 것이 더 좋아 보입니다.