1

私は現在、おもちゃの言語用のパーサーを作成しています。そのパーサーの一部として、印刷関数を作成しました...基本的にその引数を出力します。文字列定数の場合、それが行うのは

printf("%s", pointer);

それで

print("\n")

として実行する必要があります

printf("%s", ptr_to_loaded_string);

(多かれ少なかれ)

しかし、私の現在の問題は、Cがスクリプトファイルの読み取り中に特殊文字シーケンスをエスケープすることです。したがって、「\n」の代わりに「\\n」を取得します。

私の質問は、このシーケンスのエスケープを回避する方法はありますか?そうでない場合、それらに対処するための最良の方法は何ですか?私は現在、検索と置換を考えています-2'\'の各シーケンスを1つの'\'に置き換えますが、少し問題がある可能性があります(文字列の長さの変更、再割り当てなど)-それがない限り、その解決策を避けたい絶対に必要な。

編集:argh、stackoverflowは私の例を逃れた...

4

3 に答える 3

2

Cがシーケンスをエスケープ解除しているわけではありません。シーケンスをそのままにしておくだけなので、入力ストリームの「\ n」は2文字(「\」と「n」)として読み取られます。

これに対処するために私が何年も前に書いたコードを次に示します。

/*
** Public Domain by Jerry Coffin.
**
** Interpets a string in a manner similar to that the compiler
** does string literals in a program.  All escape sequences are
** longer than their translated equivalant, so the string is
** translated in place and either remains the same length or
** becomes shorter.
*/

#include <string.h>
#include <stdio.h>
#include "snip_str.h"

char *translate(char *string)
{
      char *here=string;
      size_t len=strlen(string);
      int num;
      int numlen;

      while (NULL!=(here=strchr(here,'\\')))
      {
            numlen=1;
            switch (here[1])
            {
            case '\\':
                  break;

            case 'r':
                  *here = '\r';
                  break;

            case 'n':
                  *here = '\n';
                  break;

            case 't':
                  *here = '\t';
                  break;

            case 'v':
                  *here = '\v';
                  break;

            case 'a':
                  *here = '\a';
                  break;

            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
                  numlen = sscanf(here,"%o",&num);
                  *here = (char)num;
                  break;

            case 'x':
                  numlen = sscanf(here,"%x",&num);
                  *here = (char) num;
                  break;
            }
            num = here - string + numlen;
            here++;
            memmove(here,here+numlen,len-num );
      }
      return string;
}
于 2012-05-21T13:39:43.083 に答える
1

Cスタイルの特殊文字をcharシーケンスから直接解釈することはできません(入力ファイルなどから)。シーケンスに必要な特殊文字シーケンスが含まれているかどうかを判断し、それに応じて処理するための解析ロジックを作成する必要があります

:エスケープされたエスケープ文字も適切に処理するようにしてください。

于 2012-05-21T13:21:41.813 に答える
0

GLibを使用する場合は、文字列をg_strcompressしてエスケープ文字を変換し、結果を出力できます。

于 2012-05-21T13:31:26.160 に答える