Arduino에서 문자열 구문 분석

Ammar Ali 2023년10월12일
  1. Arduino에서 strtok() 함수를 사용하여 문자열 구문 분석
  2. Arduino에서 substring() 함수를 사용하여 문자열 구문 분석
Arduino에서 문자열 구문 분석

이 튜토리얼에서는 Arduino에서 strtok()substring() 기능을 사용하여 문자열을 구문 분석하는 방법에 대해 설명합니다.

Arduino에서 strtok() 함수를 사용하여 문자열 구문 분석

문자열은 Arduino의 문자, 숫자 및 기호를 포함할 수 있습니다. Arduino에서 strtok() 함수를 사용하여 문자열을 분리하거나 구문 분석할 수 있습니다.

예를 들어 하위 문자열이 쉼표로 구분된 문자열이 있는 경우 쉼표를 사용하여 각 하위 문자열을 구분하고 각 하위 문자열을 별도의 문자열 또는 문자 배열로 저장하려고 합니다.

통사론:

char *s = strtok(char *MyS, char *MyD);

위의 코드에서 MyS는 구문 분석하려는 문자열을 포함하는 상수 char 변수이고 MyD는 구문 분석에 사용할 구분 기호, 문자 또는 기호를 포함하는 상수 char 변수이기도 합니다. 주어진 문자열. strtok() 함수는 첫 번째 토큰 또는 주어진 구분 기호 앞의 문자 배열을 반환합니다.

첫 번째 토큰을 제외한 주어진 문자열은 strtok() 함수에 저장되기 때문에 두 번째 문자열 토큰을 얻으려면 주어진 문자열 대신 NULL을 전달해야 합니다.

예를 들어 문자열을 정의하고 구분 기호와 strtok() 함수를 사용하여 구분해 보겠습니다.

char *MyS = "this is-delftstack.com-website";
char *MyD = "-";
void setup() {
  Serial.begin(9600);

  char *s = strtok(MyS, MyD);
  Serial.println(s);
  char *s1 = strtok(NULL, MyD);
  Serial.println(s1);
  char *s2 = strtok(NULL, MyD);
  Serial.println(s2);
}
void loop() {}

출력:

this is
delftstack.com
website

위의 코드에서 strtok() 함수를 세 번 사용하여 주어진 문자열에 있는 세 개의 토큰을 모두 가져왔고 각 문자열 토큰은 문자 배열에 저장됩니다. 또한 루프를 사용하여 주어진 문자열에 있는 사용 가능한 모든 토큰을 가져올 수 있으므로 코드를 반복적으로 작성할 필요가 없습니다.

Arduino 보드에 전원을 공급할 때 한 번만 실행되는 setup() 함수 내부에 코드를 작성했지만 큰 문자열의 경우 loop() 함수 내부에 코드를 작성하여 반복할 수 있습니다. setup() 함수 내에서 첫 번째 토큰을 얻고 loop() 함수 내에서 다음 토큰을 사용할 수 있는지 확인합니다.

가능한 경우 배열 안에 저장하고 주어진 문자열 안에 더 이상 문자열 토큰이 남지 않을 때까지 절차를 반복합니다.

예를 들어, 위의 문자열을 사용하고 위와 동일한 구분 기호를 사용하여 사용 가능한 모든 문자열 토큰을 찾아봅시다.

char *MyS = "this is-delftstack.com-website-Welcome";
char *MyD = "-";
char *MyArray[10];
int i = 1;
void setup() {
  Serial.begin(9600);

  char *s = strtok(MyS, MyD);
  Serial.println(s);
  MyArray[0] = s;
}
void loop() {
  char *s1 = strtok(NULL, MyD);
  if (s1 != NULL) {
    MyArray[i] = s1;
    Serial.println(MyArray[i]);
    i = i + 1;
  }
}

출력:

this is
delftstack.com
website
Welcome

위의 코드에서 문자열 토큰을 저장하는 데 사용할 크기가 10인 배열을 초기화했습니다. 주어진 문자열에 있는 문자열 토큰에 따라 초기화할 수 있습니다.

또한 배열 내부에 값을 저장하는 데 사용할 인덱스를 초기화했습니다. loop() 함수 내에서 증가시킬 것입니다.

문자열 토큰이 NULL인지 여부를 확인하기 위해 if 문을 사용했습니다. NULL이 아니면 배열에 저장하고 인덱스를 증가시킵니다.

루프는 다음 문자열 토큰을 찾기 위해 반복되어야 합니다. loop() 함수 전에 모든 토큰을 가져오려면 setup() 함수 안에 루프를 배치할 수 있습니다.

loop() 함수로 이동하기 전에 모든 문자열 토큰을 배열에 저장합니다. 구분 기호는 주어진 문자열에 있는 모든 문자, 기호 또는 숫자일 수 있으며 공백을 구분 기호로 사용할 수도 있습니다.

Arduino에서 substring() 함수를 사용하여 문자열 구문 분석

Arduino에서 substring() 함수를 사용하여 문자열을 분리하거나 구문 분석할 수도 있습니다. 주어진 인덱스 값에 따라 substring()은 주어진 문자열에서 하위 문자열을 분리합니다.

예를 들어 문자열에서 처음 5자를 가져오려면 substring() 함수와 인덱스 값 5를 사용할 수 있습니다.

통사론:

String s = MyS.substring(SIndex, EIndex);

위의 코드에서 ssubstring() 함수의 출력을 저장하는 데 사용되는 문자열 변수이고 MyS는 문자열 데이터 유형을 가진 주어진 문자열입니다. SIndex는 시작 인덱스이고 EIndex는 하위 문자열의 종료 인덱스입니다.

예를 들어, 문자열을 만들고 0에서 5 인덱스까지의 하위 문자열을 찾습니다.

String MyS = "this is delftstack.com website Welcome";

void setup() {
  Serial.begin(9600);
  String s = MyS.substring(0, 5);
  Serial.println(s);
}
void loop() {}

출력:

this

위의 코드에서는 Arduino의 시리얼 모니터를 사용하여 결과를 표시했습니다. 출력에서 알 수 있듯이 직렬 모니터 창에는 처음 5개의 문자 또는 인덱스가 표시됩니다.

다섯 번째 문자가 공백 문자이기 때문에 출력에서 4개의 문자만 볼 수 있습니다. 문자의 인덱스를 모르는 경우 indexOf() 함수를 사용하여 해당 문자의 인덱스를 가져올 수 있습니다.

indexOf() 함수 구문:

int MyI = MyS.indexOf(char);

위의 코드에서 MyI 변수는 주어진 문자의 인덱스인 출력을 저장하고 char는 인덱스를 찾으려는 문자입니다. MyS는 주어진 문자열을 포함하는 문자열 변수입니다.

예를 들어 공백으로 구분된 단어 문자열이 있고 문자열에서 첫 번째 단어를 가져오려고 합니다. indexOf() 함수를 사용하여 공백 문자의 인덱스를 찾은 다음 해당 인덱스를 substring() 함수 내부로 전달하여 첫 번째 단어를 얻을 수 있습니다.

String MyS = "this is delftstack.com website Welcome";

void setup() {
  Serial.begin(9600);
  int MyI = MyS.indexOf(" ");
  String s = MyS.substring(0, MyI);
  Serial.println(s);
}
void loop() {}

출력:

this

위 출력에서 볼 수 있듯이 주어진 문자열에서 첫 번째 단어를 추출했습니다. 주어진 문자열에서 모든 세계를 얻으려면 루프를 사용해야 합니다.

주어진 문자의 인덱스를 검색하는 데 사용되는 시작 위치를 설정하기 위해 indexOf() 함수 내부에 두 번째 인수를 전달할 수도 있습니다.

예를 들어 위의 예에서 문자열의 처음 두 단어를 얻으려면 시작 인덱스 값을 5로 설정할 수 있으며 함수는 두 번째 구분 기호의 인덱스 값을 반환합니다. 처음 두 단어를 추출합니다.

우리는 위의 코드에서 setup() 함수 내부에 코드를 작성했으며 이 코드는 한 번만 실행됩니다. 그러나 loop() 함수 내부에 코드를 작성하면 코드가 반복됩니다.

loop() 함수 내부에 코드를 작성하여 주어진 문자열에 있는 모든 하위 문자열을 찾을 수 있습니다.

예를 들어 위의 문자열에 있는 모든 하위 문자열을 찾아봅시다.

String MyS = "this is delftstack.com website Welcome";
int MyP = 0;
int MyI = 0;
String array[10];
int index = 0;
void setup() { Serial.begin(9600); }
void loop() {
  if (MyI >= 0) {
    MyI = MyS.indexOf(" ", MyP);
    String s = MyS.substring(MyP, MyI);
    Serial.println(s);
    MyP = MyI + 1;
    array[index] = s;
    Serial.println(array[index]);
    index = index + 1;
  }
}

출력:

this
is
delftstack.com
website
Welcome

위의 코드에서 if 문 안에 주어진 구분 기호의 인덱스 값을 사용하여 주어진 문자열의 끝에 도달했는지 확인했습니다. 왜냐하면 indexOf() 함수는 전달한 인덱스가 음수 값을 반환하기 때문입니다 indexOf() 함수 내부에서 주어진 문자열의 길이를 초과합니다.

이전 인덱스 값과 현재 인덱스 값에 사용할 두 정수 변수 MyPMyI를 초기화했습니다.

MyP 또는 이전 인덱스 값을 사용하여 MyI 또는 다음 인덱스 값을 얻은 다음 이 값을 사용하여 하위 문자열을 찾습니다. 그런 다음 MyP 또는 이전 인덱스의 값을 현재 인덱스에 1을 더한 값으로 변경하여 다음에 루프가 반복되도록 합니다. 우리는 다음 단어를 얻을 것입니다.

또한 인덱스 값에 따라 하위 문자열을 저장하기 위해 크기 10의 문자열 배열을 초기화했습니다. if 문에서 인덱스를 증가시켜 다음 인덱스 값에 다음 하위 문자열을 저장합니다.

주어진 문자열에 있는 모든 하위 문자열을 가져오려면 루프가 반복되어야 합니다. loop() 함수를 시작하기 전에 하위 문자열을 얻으려면 setup () 함수 내에서 루프를 사용할 수 있습니다.

위의 예에서는 공백을 구분 기호로 사용했지만 임의의 문자, 기호 및 숫자를 사용하여 주어진 문자열을 구문 분석할 수 있습니다. indexOf()substring() 함수는 Arduino의 문자열 클래스에 속하며 문자열 클래스에 대한 자세한 내용은 이 링크를 확인하십시오.

작가: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

관련 문장 - Arduino String