Escape all special characters in printf()

前端 未结 4 1576
遇见更好的自我
遇见更好的自我 2020-12-07 04:24

Is there an easy way to escape all special characters in the printf() function?

The reason why I would like to know how to do this is because I am print

4条回答
  •  星月不相逢
    2020-12-07 05:09

    #include 
    #include 
    
    
    /* Converts a buffer of specified lenth to
     * ASCII representation as it was a C string literal.
     * Returns how much bytes from source was processed
     * (ideally ret == src_sz)
     */
    int binbuf_to_escaped_C_literal(const char *src_buf, size_t src_sz, char *dst_str, size_t dst_sz)
    {
        const char *src = src_buf;
        char *dst = dst_str;
    
        while (src < src_buf + src_sz)
        {
            if (*src == '\\')
            {
                *dst++ = '\\';
                *dst++ = *src++;
            }
            else if (isprint(*src))
            {
                *dst++ = *src++;
            }
            else
            {
                switch(*src)
                {
                    case '\n':
                        *dst++ = '\\';
                        *dst++ = 'n';
                        break;
                    case '\r':
                        *dst++ = '\\';
                        *dst++ = 'r';
                        break;
                    case '\t':
                        *dst++ = '\\';
                        *dst++ = 't';
                        break;
                    case '\0':
                        *dst++ = '\\';
                        *dst++ = '0';
                        break;
                    default:
                        sprintf(dst, "0x%x", *src);
                        dst += 4;
                }
                src++;
            }
    
            // next iteration requires up to 5 chars in dst buffer, for ex.  "0xab\0"
            if (dst > (dst_str + dst_sz - 5)) {
                break;
            }
        }
    
        *dst = '\0';
    
        return src - src_buf;
    }
    
    
    int main(int argc, char **argv)
    {
        const char binbuf[] = "strange \n\r\t\0\0\0\0\0\\\\ string";
        size_t sz = sizeof(binbuf) - 1; // drop trailing nul terminator
    
        char escaped[128];
    
        if (binbuf_to_escaped_C_literal(binbuf, sz, escaped, sizeof(escaped)) != sz) {
            fprintf(stderr, "Destination string buffer is too small\n");
            return 1;
        }
    
        printf("Escaped: %s\n", escaped);
    
        // $ ./escape-binary-buf                                          //
        // Escaped: strange \n\r\t\0\0\0\0\0\\\\ string                   //
    
        return 0;
    }
    

提交回复
热议问题