Oct-File에서의 문자열

Oct-File에서의 문자열 (Character Strings in Oct-Files)

oct-file 안에서 문자열을 다루는 건 생각보다 간단해요. Octave에서 문자열은 그냥 특별한 Array 클래스일 뿐이거든요. 단일 따옴표 문자열과 이중 따옴표 문자열의 차이를 어떻게 다루는지 Appendix A.1.3절을 정리해 볼게요.

출처: Character Strings in Oct-Files

본문

Octave에서 문자 문자열은 그냥 특별한 Array 클래스예요. 다음 예시를 보죠.

#include <octave/oct.h>

DEFUN_DLD (stringdemo, args, , "String Demo")
{
  if (args.length () != 1)
    print_usage ();

  octave_value_list retval;

  charMatrix ch = args(0).char_matrix_value ();

  retval(1) = octave_value (ch, '\'');  // Single Quote String

  octave_idx_type nr = ch.rows ();

  for (octave_idx_type i = 0; i < nr / 2; i++)
    {
      std::string tmp = ch.row_as_string (i);

      ch.insert (ch.row_as_string (nr-i-1).c_str (), i, 0);
      ch.insert (tmp.c_str (), nr-i-1, 0);
    }

  retval(0) = octave_value (ch, '"');  // Double Quote String

  return retval;
}

이 함수를 사용하는 예시는 다음과 같아요.

s0 = ["First String"; "Second String"];
[s1,s2] = stringdemo (s0)
⇒  s1 = Second String
        First String

⇒  s2 = First String
        Second String

typeinfo (s2)
⇒  sq_string
typeinfo (s1)
⇒  string

Octave에서 문자열의 한 가지 추가적인 복잡함은 단일 따옴표 문자열과 이중 따옴표 문자열의 차이예요. octave_value가 단일 따옴표 문자열인지 이중 따옴표 문자열인지 알아내려면 아래에 보이는 판별(predicate) 검사 중 하나를 쓰면 됩니다.

if (args(0).is_sq_string ())
  octave_stdout << "First argument is a single quoted string\n";
else if (args(0).is_dq_string ())
  octave_stdout << "First argument is a double quoted string\n";

다만 두 문자열 유형 모두 charNDArray 타입으로 표현된다는 점을 유의하세요. 그래서 octave_value에 할당할 때는 문자열의 유형을 지정해야 합니다. 예를 들어,

octave_value_list retval;
charNDArray ch;
...
// Create single quoted string
retval(1) = octave_value (ch);   // default constructor is sq_string
           OR
retval(1) = octave_value (ch, '\'');  // explicitly create sq_string

// Create a double quoted string
retval(0) = octave_value (ch, '"');

더 알아보기

  • octave-external-code-interface — 외부 코드 인터페이스 개요
  • octave-mex-files — mex-파일 인터페이스
  • octave-strings — Octave 스크립트에서의 문자열