#### 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")
    {
      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;
    }

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