1

エスケープされたシーケンスを、逐語的に保存されているファイルから読み取りたい。

ある時点で、私の呼び出しは、ansi-c形式の関数の1つになります。

sprintf(target, format, ...);

私の問題はargsの部分なしで現れます-それでその詳細について心配しないでください。

フォーマット文字列はファイルからロードされ、バッファに保存されます。 '\\' 'r' '\0' (ファイルには'\\' 'r' '\0')が含まれています

ターゲットに「」を格納したいのです\rが、ターゲットは常に。のようになり'\\' 'r' '\0'ます。

どうすればこの問題を解決できますか?


編集:

私の問題を解決するために。

テキストファイルには3文字が含まれています-'\\' 'r' '\0'

これらの3つは読み取られ、2つの文字のように格納する必要があります'\r' '\0'

ユーザーはファイルの内容を自由に変更できます。エディターでコンパイルする前に、ファイルの行を書いたように解釈する方法を見つける必要があります。

4

4 に答える 4

2

doubleは、""から文字列を作成しますが、単一の文字またはエスケープされたシーケンスを参照します。strcatが必要とするように、-functionを使用して、フォーマットに1文字を追加することができます。試す\r'\r'strcatconst char*

strcat(format, '\r');

もちろん、十分なメモリを提供する必要があります。

オリ・チャールズワースが提供したように、あなたのひもを取り、

len = strlen(str); str[len] = '\r';
str[len+1] = '\0';

その特定のケースでは、文字列を上書きしています。

ここを見てください。

于 2013-03-27T11:02:18.670 に答える
2

エスケープ解除を実行する標準機能はないため、自分で実行する必要があります。

void unescape(const char *in, char *out)
{
    int esc = 0;

    while (*in) {

       if (esc) {

          switch(*in) {
           case 'r':
              *out++ = '\r';
              break;
           case 'n':
              *out++ = '\n';
              break;
           default:
              *out++ = '\\';
              *out++ = *in;
              break;
          }

          esc = 0;

        } else if (*in == '\\') {
          esc = 1;
       } else {
          *out++ = *in;
       }

       in++;
   }

 *out = 0;
}

(*注:「out」バッファーは少なくとも「in」バッファーと同じ大きさである必要があります。最後の文字が\の場合、それは失われます)

その後、あなたはします

char input[BUFSZ];
char buf[BUFSZ];

//read data from the file into 'input'

unescape(input, buf);
sprintf(target, buf, ...);
于 2013-03-27T11:33:13.910 に答える
2

二度できますsprintfか?

元のファイルに"\\r"(3つの非null文字)がある場合、最初の実行で(2つの非null文字、バックスラッシュをエスケープした)sprintfのターゲットが作成されます。"\r"

次に、それを次ののフォーマット文字列として使用できます。これにより、 (単一のキャリッジリターン文字)sprintfのターゲットが作成されます。'\r'

編集:元のフォーマット文字列がフォーマット指定子()もエスケープしない場合、これはうまく機能しません%

于 2013-03-27T19:37:54.050 に答える
1

外部フォーマットを解析し、必要に応じて(内部)フォーマットを構築します。例:

if ((externalformat[0] == '\\')
      && ((externalformat[1] == 'r')
      && ((externalformat[2] == 0))
{
    strcpy(format, "\r");
}

/* use format */
sprintf(target, format, ...);
于 2013-03-27T11:18:14.890 に答える