#### A.1.3 Character Strings in Oct-Files

A character string in Octave is just a special `Array` class. Consider the example:

    #include <octave/oct.h>

    DEFUN_DLD (stringdemo, args, , "String Demo")
    {
      octave_value_list retval;
      int nargin = args.length ();

      if (nargin != 1)
        print_usage ();
      else
        {
          charMatrix ch = args(0).char_matrix_value ();

          if (! error_state)
            {
              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;
    }

An example of the use of this function is

    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

One additional complication of strings in Octave is the difference between single quoted and double quoted strings. To find out if an `octave_value` contains a single or double quoted string use one of the predicate tests shown below.

    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";

Note, however, that both types of strings are represented by the `charNDArray` type, and so when assigning to an `octave_value`, the type of string should be specified. For example:

    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, '"');