How to print special characters explicitly in C?

c, printf

Solution

There is no built-in mechanism to do this. You have to do it manually, character-by-character. However, the functions in `ctype.h` may help. Specifically, in the "C" locale, the function `isprint` is guaranteed to be true for all of the graphic characters in the basic execution character set, which is effectively the same as all the graphic characters in 7-bit ASCII, plus space; and it is guaranteed not to be true for all the control characters in 7-bit ASCII, which includes tab, carriage return, etc.

Here is a sketch:

#include <stdio.h>
#include <ctype.h>
#include <locale.h>

int main(void)
{
    int x;
    setlocale(LC_ALL, "C"); // (1)

    while ((x = getchar()) != EOF)
    {
        unsigned int c = (unsigned int)(unsigned char)x; // (2)

        if (isprint(c) && c != '\\')
            putchar(c);
        else
            printf("\\x%02x", c);
    }
    return 0;
}

This does not escape `'` nor `"`, but it does escape `\`, and it is straightforward to extend that if you need it to.

Printing `\n` for U+000A, `\r` for U+000D, etc. is left as an exercise. Dealing with characters outside the basic execution character set (e.g. UTF-8 encoding of U+0080 through U+10FFFF) is also left as an exercise.

This program contains two things which are not necessary with a fully standards-compliant C library, but in my experience have been necessary on real operating systems. They are marked with `(1)` and `(2)`.

1) This explicitly sets the 'locale' configuration the way it is supposed to be set by default.

2) The value returned from `getchar` is an `int`. It is supposed to be either a number in the range representable by `unsigned char` (normally 0-255 inclusive), or the special value `EOF` (which is not in the range representable by `unsigned char`). However, buggy C libraries have been known to return negative numbers for characters with their highest bit set. If that happens, the `printf` will print (for instance) `\xffffffa1` when it should've printed `\xa1`. Casting `x` to `unsigned char` and then back to `unsigned int` corrects this.

Problem

When I use below code: ``` #include <stdio.h> int main(void) { printf("%s","Hello world\nHello world"); return 0; } ``` it prints as: ``` Hello world Hello world ``` How can I prevent this and print it as raw string literal in C? I mean it should be displayed as it is in terminal window like below: ``` Hello world\nHello world ``` I know I can achieve this by using backslash for printf but is there any other C function or way to do this without backslashing? It would be helpful when reading files.

Original source

Related problems