Exercise 7.2 - print non-graphic characters in octal or hexadecimal¶
Question¶
Write a program that will print arbitrary input in a sensible way. As a minimum, it should print non-graphic characters in octal or hexadecimal according to local custom, and break long text lines.
/**
* Write a program that will print arbitrary input in a sensible way. As a
* minimum, it should print non-graphic characters in octal or hexadecimal
* according to local custom, and break long text lines.
*/
#include <ctype.h>
#include <stdio.h>
#define MAXLINE 100 /* maximum number of chars in one line */
#define OCTLEN 6 /* length of an octal value */
const char *input = "This\tis\ta\ttest. With a very long line.";
int input_index = 0;
int _getchar(void) {
if (input[input_index] == '\0') {
return EOF;
} else {
return input[input_index++];
}
}
/* inc : increment position counter for output */
int inc(int pos, int n) {
if (pos + n < MAXLINE)
return pos + n;
else {
putchar('\n');
return n;
}
}
/* print arbitrary input in a sensible way */
int main(void) {
int c, pos;
pos = 0; /* position in the line */
while ((c = _getchar()) != EOF)
if (iscntrl(c) || c == ' ') {
/* non-graphic or blank character */
pos = inc(pos, OCTLEN);
printf("\\%03o", c);
/* newline character */
if (c == '\n')
pos = 0;
putchar('\n');
} else {
/* graphic character */
pos = inc(pos, 1);
putchar(c);
}
return 0;
}
Explanation¶
We use the standard library function iscntrl declared in ctype.h to determine if a character is a control character. We keep track of the position to print the output in the inc function and print the output in the putchar function. If there is special character, we allocate 6 characters to it and print the character in octal along with the special character.