printing all escape sequence characters

C

chandanlinster

consider the following program

/****************************************************/
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
int c;

for (c = '\a'; c <= '\z'; c++)
printf("%c %d\n", c, (int)c);

exit(EXIT_SUCCESS);
}

/******************************************************/

here I am trying to print all escape sequences (well, most of them are
illegal).

the output is
----------------------------------------
7
8
9

10

11

12
13
14
15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
32
! 33
" 34
# 35
$ 36
% 37
& 38
' 39
( 40
) 41
* 42
+ 43
, 44
- 45
.. 46
/ 47
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
: 58
; 59
< 60
= 61
? 63
@ 64
A 65
B 66
C 67
D 68
E 69
F 70
G 71
H 72
I 73
J 74
K 75
L 76
M 77
N 78
O 79
P 80
Q 81
R 82
S 83
T 84
U 85
V 86
W 87
X 88
Y 89
Z 90
[ 91
\ 92
] 93
^ 94
_ 95
` 96
a 97
b 98
c 99
d 100
e 101
f 102
g 103
h 104
i 105
j 106
k 107
l 108
m 109
n 110
o 111
p 112
q 113
r 114
s 115
t 116
u 117
v 118
w 119
x 120
y 121
z 122
--------------------------------------------------

after executing the program I can hear my CPU speaker give away "beep"
sound. This indicates (i presume) that '\a' is outputted correctly. But
what about the other characters that are outputted.

I am using gcc 4.1 on linux.
 
A

Andrew Poelstra

consider the following program

/****************************************************/
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
int c;

for (c = '\a'; c <= '\z'; c++)
printf("%c %d\n", c, (int)c);

exit(EXIT_SUCCESS);
}

/******************************************************/

Oh my. This is the most interestingly incorrect algorithm I have seen
in a long while. Congratulations. :)

Your fatal flaw is that the sequences '\a' to '\z' are /not/ guaranteed
to be in contiguous order, and they almost certainly will not be in real
life. (I'm not even sure of the consequences of using invalid escape
sequences like '\q'.)

A better algorithm would be:
1. Take a good C book.
2. Locate the page with the table of escape sequences.
3. Scan it.
4. Switch to Algorithm O (optical character recognition)
 
B

backasswards

chandanlinster said:
after executing the program I can hear my CPU speaker give away "beep"
sound. This indicates (i presume) that '\a' is outputted correctly. But
what about the other characters that are outputted.

I am using gcc 4.1 on linux.

There are several books and websites that explain what each escape
characters does.
 
B

Barry Schwarz

consider the following program

/****************************************************/
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
int c;

for (c = '\a'; c <= '\z'; c++)

Didn't your compiler complain that '\z' is an invalid escape sequence
(syntax error)?

By the way, '\n' in ASCII is 0x0a while '\t' is 0x09 so it is obvious
they need not run in order.

You might have more luck using 0 and CHAR_MAX as your limits.
printf("%c %d\n", c, (int)c);

c is already an int. What do you think the cast accomplishes? Even
if c were a char, for unspecified arguments to a variadic function
char (and short) is always promoted to int. (And float is promoted to
double.)
exit(EXIT_SUCCESS);
}

/******************************************************/

here I am trying to print all escape sequences (well, most of them are
illegal).

Consider yourself lucky that one of them doesn't mean format your hard
drive.
the output is
----------------------------------------
7
8
9

10

11

12
13
14
15
 16 snip
 31
32
! 33
" 34
# 35
$ 36
% 37
& 38
' 39
( 40
) 41
* 42
+ 43
, 44
- 45
. 46
/ 47
0 48 snip
9 57
: 58
; 59
< 60
= 61
? 63
@ 64
A 65 snip
Z 90
[ 91
\ 92
] 93
^ 94
_ 95
` 96
a 97 snip
z 122
--------------------------------------------------

after executing the program I can hear my CPU speaker give away "beep"
sound. This indicates (i presume) that '\a' is outputted correctly. But
what about the other characters that are outputted.

Well, the value 9 appeared to tab over consistent with its definition
as horizontal tab. The value 8 should have backspaced but I'll bet
your system swallowed it because it knew you were at the beginning of
a line. The value 10 did produce a new line consistent with its
definition as line feed. So did values 11 and 12 which I guess is one
of the valid interpretations of vertical tab and form feed as it
applies to displays. Values 16-31 are apparently unprintable which is
consistent with their definitions.

What did you expect? What is your real question?
I am using gcc 4.1 on linux.


Remove del for email
 
G

Giorgio Silvestri

Barry Schwarz said:
Didn't your compiler complain that '\z' is an invalid escape sequence
(syntax error)?

By the way, '\n' in ASCII is 0x0a while '\t' is 0x09 so it is obvious
they need not run in order.

You might have more luck using 0 and CHAR_MAX as your limits.


c is already an int. What do you think the cast accomplishes? Even
if c were a char, for unspecified arguments to a variadic function
char (and short) is always promoted to int. (And float is promoted to
double.)

Not always.

If char is "unsigned" and int cannot represent all values of "unsigned char"
char is promoted to unsigned int, signed char is always
promoted to int.
 
K

Kenneth Brody

Barry said:
consider the following program [...]
for (c = '\a'; c <= '\z'; c++) [...]
printf("%c %d\n", c, (int)c);
[...]
What did you expect? What is your real question?
[...]

I think he expected c to loop as:

'\a'
'\b'
'\c'
'\d'
...
'\x'
'\y'
'\z'

--
+-------------------------+--------------------+-----------------------+
| Kenneth J. Brody | www.hvcomputer.com | #include |
| kenbrody/at\spamcop.net | www.fptech.com | <std_disclaimer.h> |
+-------------------------+--------------------+-----------------------+
Don't e-mail me at: <mailto:[email protected]>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,990
Messages
2,570,211
Members
46,796
Latest member
SteveBreed

Latest Threads

Top