我想从一个文件中读取一个转义序列,该序列是逐字存储的。
在某些情况下,我的调用以ansi-c格式的函数之一结束。
sprintf(target, format, ...);
我的问题在没有args部分的情况下就表现出来了-所以不用担心它的细节。
从文件加载格式字符串并将其存储在缓冲区中。'\\' 'r' '\0'
(文件包含'\\' 'r' '\0'
)
我希望目标存储"\r
",但是我的目标总是像'\\' 'r' '\0'
一样结束。
我该如何解决这个问题?
编辑:
来解决我的问题。
文本文件包含三个字符- '\\' 'r' '\0'
这三个字符是读取的,需要像两个字符'\r' '\0'
一样进行存储
用户可以自由地更改文件内容,我必须找到一种方法来解释文件中的行,就像我在编辑器中编译前编写的那样。
发布于 2013-03-27 19:33:14
没有标准的函数可以帮你取消转义,所以你必须自己去做。
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-27 19:02:19
double ""
从\r
中生成字符串,而'\r'
引用单个字符或转义序列。您可以使用strcat
-function并将单个字符附加到您的格式,因为strcat需要const char*
。试一试
strcat(format, '\r');
当然,您需要提供足够的内存。
就像奥利·查尔斯沃思提供的那样,拿起你的字符串,
len = strlen(str); str[len] = '\r';
str[len+1] = '\0';
在这种情况下,您正在重写您的字符串。
看,here。
发布于 2013-03-27 19:18:15
根据需要解析外部格式并构建(内部)格式,例如:
if ((externalformat[0] == '\\')
&& ((externalformat[1] == 'r')
&& ((externalformat[2] == 0))
{
strcpy(format, "\r");
}
/* use format */
sprintf(target, format, ...);
https://stackoverflow.com/questions/15657176
复制相似问题