我正在为我的玩具语言编写一个解析器,作为该解析器的一部分,我已经编写了很好的打印功能......基本上打印了它的参数。对于字符串常量,它只是
printf("%s", pointer);
所以
print("\n")
应该以
执行printf("%s", ptr_to_loaded_string);
(或多或少)
但是,我目前的问题是,C在读取脚本文件时会转义特殊字符序列。所以不是“\ n”而是“\ n”。
我的问题是:有什么方法可以避免这些序列的逃避,如果不是,那么处理它们的最佳方法是什么?我正在考虑搜索和替换 - 用'\'替换2'\'的每个序列,但它可能有点问题(字符串长度更改,重新分配等) - 我想避免该解决方案,除非它是绝对必要。
编辑:argh,stackoverflow逃过了我的例子......
答案 0 :(得分: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;
}
答案 1 :(得分:1)
您不能从char序列直接解释C样式的特殊字符(例如,来自输入文件)。您需要编写解析逻辑来确定序列是否包含所需的特殊char序列并相应地对其进行处理
注意:确保您也正确处理转义转义字符。
答案 2 :(得分:0)
如果您愿意使用GLib,您可以g_strcompress使用字符串转换转义字符,然后打印结果。