1

我目前正在为我的玩具语言编写一个解析器,作为该解析器的一部分,我已经很好地编写了 print 函数......基本上打印了它的参数。对于字符串常量,它所做的只是

printf("%s", pointer);

所以

print("\n")

应该被执行为

printf("%s", ptr_to_loaded_string);

(或多或少)

但是,我当前的问题是,C 在读取脚本文件时转义了特殊字符序列。所以我得到的不是“\n”,而是“\\n”。

我的问题是:有什么方法可以避免这些序列的转义,如果没有,处理它们的最佳方法是什么?我目前正在考虑搜索和替换 - 用一个 '\' 替换每个 2 '\' 序列,但这可能有点问题(字符串长度更改、重新分配等) - 我想避免这种解决方案,除非它是绝对有必要。

编辑:啊,stackoverflow 逃脱了我的例子....

4

3 回答 3

2

并不是说 C 没有对您的序列进行转义——而是它只是将它们单独放置,因此输入流中的“\n”被读取为两个字符('\' 和 '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 回答