Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert a c string into its escaped version in c?

Tags:

c

Is there any buildin function or a alternative simple and fast way of escape a C character array that if used with e.g printf should yield original character array again.

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.

Is there a simple way in c to escape a string with c escape characters.

Update

I have buffer containing a string with escape character. And i want to include in a C file. For that i need to escape it so it can be complied. I just need to know if there is simple way of doing it instead of scanning the buffer for \n \t etc and generating there c escape char.

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

Update 2

I wrote this function. It work fine.

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;
}
like image 776
particle Avatar asked Jul 08 '10 07:07

particle


People also ask

How do you escape a string in C #?

"; C# includes escaping character \ (backslash) before these special characters to include in a string. Use backslash \ before double quotes and some special characters such as \,\n,\r,\t, etc. to include it in a string.

How do you escape a string?

String newstr = "\\"; \ is a special character within a string used for escaping. "\" does now work because it is escaping the second " . To get a literal \ you need to escape it using \ .

What is the '\ n escape character?

In particular, the \n escape sequence represents the newline character. A \n in a printf format string tells awk to start printing output at the beginning of a newline.

How do I escape a character in a string?

To insert characters that are illegal in a string, use an escape character. An escape character is a backslash \ followed by the character you want to insert.


2 Answers

No, there isn't any standard function for creating the source code version of the string. But you could use the iscntrl function to write one, or just use the switch keyword.

But, unless your program writes out a C source file intended to be run through the compiler, you don't need to work with escaped strings. printf doesn't process character escape sequences, only variable insertions (%d, %s, etc)

Specifically, the following produce the same output:

printf("\tHello World\n");

and

const char* str = "\tHello World\n";
printf(str);

and

const char* str = "\tHello World\n";
printf("%s", str);

The second one isn't a good idea, because if str contained % your program would produce bad output and could crash.

EDIT: For producing the source code version, there are a couple of approaches:

Simpler, but less readable output:

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

More readable results:

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);
}
like image 115
Ben Voigt Avatar answered Oct 28 '22 17:10

Ben Voigt


If you don't require the resulting string to be human-readable, and your compile-time character set is the same as your execution character set, then the simplest way is to use code point escapes for everything:

int print_string_literal(char *s)
{
    putchar('\"');

    while (*s)
    {
        unsigned cp = (unsigned char)*s++;
        printf("\\x%.2x", cp);
    }

    putchar('\"');
}

You could finess this some to produce nicer looking strings, but you did ask for something simple...

like image 41
caf Avatar answered Oct 28 '22 16:10

caf