我想从逐字存储的文件中读取转义序列。
在某些时候,我的电话会以其中一个ansi-c格式的函数结束
sprintf(target, format, ...);
我的问题在没有args部分的情况下表现出来 - 所以不要担心它的细节。
格式字符串从文件加载并存储在缓冲区中。
'\\' 'r' '\0'
(该文件包含'\\' 'r' '\0'
)
我希望目标存储“\r
”,但我的目标总是像'\\' 'r' '\0'
一样。
我该如何解决这个问题?
编辑:
解决我的问题。
文本文件包含三个字符 - '\\' 'r' '\0'
这三个被阅读,需要像两个字符'\r' '\0'
用户可以自由更改文件内容,我必须找到一种方法来解释文件中的行,就像我在编辑器中编译之前编写的那样。
答案 0 :(得分:2)
双""
从\r
中创建一个字符串,而'\r'
表示单个字符或转义序列。您可以使用strcat
- 函数并在格式中附加单个字符,因为strcat需要const char*
。
尝试
strcat(format, '\r');
当然,您需要提供足够的内存。
正如奥利查尔斯沃思提供的那样,带上你的字符串和
len = strlen(str); str[len] = '\r';
str[len+1] = '\0';
在这种特殊情况下,你正在写你的字符串。
看here。
答案 1 :(得分: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是\,则会丢失)
然后你做
char input[BUFSZ];
char buf[BUFSZ];
//read data from the file into 'input'
unescape(input, buf);
sprintf(target, buf, ...);
答案 2 :(得分:2)
你可以sprintf
两次吗?
如果原始文件有"\\r"
(三个非空字符),则第一次运行sprintf
会创建"\r"
的目标(两个非空字符,反斜杠逸出)。
然后您可以将其用作下一个sprintf
的格式字符串,该字符串应创建'\r'
的目标(单个回车符)。
编辑:如果原始格式字符串也不会转义格式说明符(%
),这将无效。
答案 3 :(得分:1)
解析外部格式并根据需要构建(内部)格式,例如:
if ((externalformat[0] == '\\')
&& ((externalformat[1] == 'r')
&& ((externalformat[2] == 0))
{
strcpy(format, "\r");
}
/* use format */
sprintf(target, format, ...);