Your main problem is that you are outputting the character regardless of the fact that you may have already output its translation. Those if
statements will do what you expect but, in their present form, they simply drop through to the next statement.
Hence you'd be looking for something more like this:
while ((c = getchar()) != EOF) {
// Detect/translate special characters.
if (c == '\t') {
putchar ('\\');
putchar ('t');
continue; // Go get next character.
}
if (c == '\b') {
putchar ('\\');
putchar ('b');
continue; // Go get next character.
}
if (c == '\\') {
putchar ('\\');
putchar ('\\');
continue; // Go get next character.
}
// Non-special, just echo it.
putchar (c);
}
Another possibility, shorter and more succinct would be:
while ((c = getchar()) != EOF) {
// Detect/translate special characters, otherwise output as is.
switch (c) {
case '\t': putchar ('\\'); putchar ('t'); break;
case '\b': putchar ('\\'); putchar ('b'); break;
case '\\': putchar ('\\'); putchar ('\\'); break;
default: putchar (c);
}
}