如何将ac字符串转换为c中的转义版本?

par*_*cle 10 c

是否存在任何构建函数或替代简单快速的转义C字符数组,如果与例如一起使用,printf应该再次产生原始字符数组.

char* str = "\tHello World\n";
char* escaped_str = escape(str); //should contain "\tHello World\n" with char \ ,t.
printf(escaped_str); //should print out [TAB]Hello World[nextline] similar to if str was printed.
Run Code Online (Sandbox Code Playgroud)

c中是否有一种简单的方法来转义带有c转义字符的字符串.

更新

我有缓冲区包含一个带转义字符的字符串.我想要包含在C文件中.为此,我需要逃避它,以便它可以被遵守.我只需要知道是否有简单的方法来做它而不是扫描缓冲区\n \n等,并生成c escape字符.

for(int i=0; i< strlen(buffer);i++)
    if(buffer[i]=='\n')
      sprintf(dest,"\\n")
    else ....
Run Code Online (Sandbox Code Playgroud)

更新2

我写了这个函数.它工作正常.

char* escape(char* buffer){
    int i,j;
    int l = strlen(buffer) + 1;
    char esc_char[]= { '\a','\b','\f','\n','\r','\t','\v','\\'};
    char essc_str[]= {  'a', 'b', 'f', 'n', 'r', 't', 'v','\\'};
  char* dest  =  (char*)calloc( l*2,sizeof(char));
    char* ptr=dest;
    for(i=0;i<l;i++){
        for(j=0; j< 8 ;j++){
            if( buffer[i]==esc_char[j] ){
              *ptr++ = '\\';
              *ptr++ = essc_str[j];
                 break;
            }
        }
        if(j == 8 )
      *ptr++ = buffer[i];
    }
  *ptr='\0';
    return dest;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 6

不,没有任何标准功能来创建字符串的源代码版本.但您可以使用该iscntrl函数编写一个,或者只使用switch关键字.

但是,除非您的程序写出要通过编译器运行的C源文件,否则您不需要使用转义字符串. printf不处理字符转义序列,唯一的变量插入(%d,%s等)

具体来说,以下产生相同的输出:

printf("\tHello World\n");
Run Code Online (Sandbox Code Playgroud)

const char* str = "\tHello World\n";
printf(str);
Run Code Online (Sandbox Code Playgroud)

const char* str = "\tHello World\n";
printf("%s", str);
Run Code Online (Sandbox Code Playgroud)

第二个不是一个好主意,因为如果str包含%你的程序将产生不良输出并可能崩溃.

编辑:为了生成源代码版本,有几种方法:

输出更简单但可读性更低:

if (iscntrl(ch) || ch == '\\' || ch == '\"' || ch == '\'') {
   fprintf(outf, "\\%03o", ch);
}
else
   fputc(ch, outf);
Run Code Online (Sandbox Code Playgroud)

更可读的结果:

switch (ch) {
  case '\"':
    fputs("\\\"", outf);
    break;
  case '\'':
    fputs("\\\'", outf);
    break;
  case '\\':
    fputs("\\\\", outf);
    break;
  case '\a':
    fputs("\\a", outf);
    break;
  case '\b':
    fputs("\\b", outf);
    break;
  case '\n':
    fputs("\\n", outf);
    break;
  case '\t':
    fputs("\\t", outf);
    break;
  // and so on
  default:
    if (iscntrl(ch)) fprintf(outf, "\\%03o", ch);
    else fputc(ch, outf);
}
Run Code Online (Sandbox Code Playgroud)