在sprintf中逃脱

时间:2013-03-27 10:57:17

标签: c printf

我想从逐字存储的文件中读取转义序列。

在某些时候,我的电话会以其中一个ansi-c格式的函数结束

sprintf(target, format, ...);

我的问题在没有args部分的情况下表现出来 - 所以不要担心它的细节。

格式字符串从文件加载并存储在缓冲区中。 '\\' 'r' '\0'(该文件包含'\\' 'r' '\0'

我希望目标存储“\r”,但我的目标总是像'\\' 'r' '\0'一样。

我该如何解决这个问题?


编辑:

解决我的问题。

文本文件包含三个字符 - '\\' 'r' '\0'

这三个被阅读,需要像两个字符'\r' '\0'

一样存储

用户可以自由更改文件内容,我必须找到一种方法来解释文件中的行,就像我在编辑器中编译之前编写的那样。

4 个答案:

答案 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, ...);