On Wed, Jun 11, 2008, Dan Bar Dov wrote about "Help with printf":
>...
> But if I put the format in a variable (as opposed to a string literal), I
> find that
> escape processing does not occur.
>...
> and running (# is the prompt)
> # ./test "%s flowers\n" 7
> 
> give the output
> 7 flowers\n#

What you call "escape processing", i.e., the conversion of the two characters
"\n" into one newline character (ASCII code 10), isn't done by the printf
library function - rather it is done by the C compiler!
When the C compiler sees the character \ followed by n inside a string
constant, it translates it into a newline character.

The shell does not normally do this translation, which is why your "test"
program gets the characters \ and n, not a newline.

There are several ways you can fix this problem. The most obvious one is
to parse the string in the C code, and do the replacement of \n into a
newline yourself. Another option is to have "echo" (sometimes a shell builtin,
sometimes an external program) do the replacement for you, as in:
        ./test `echo -n "%s flowers\n"` 7

Finally, if your intent is to write a printf-like tool for the shell, you
can just use the "printf" tool that comes from GNU's coreutils, that already
does its own backslash transformations. For example:

        $ printf "1+1=%5d\n" 2  
        1+1=    2

By the way, you can look at coreutil's printf code to see how it does the
backslash transformations (isn't free software great?)

-- 
Nadav Har'El                        |     Wednesday, Jun 11 2008, 8 Sivan 5768
[EMAIL PROTECTED]             |-----------------------------------------
Phone +972-523-790466, ICQ 13349191 |If you lost your left arm, your right arm
http://nadav.harel.org.il           |would be left.

=================================================================
To unsubscribe, send mail to [EMAIL PROTECTED] with
the word "unsubscribe" in the message body, e.g., run the command
echo unsubscribe | mail [EMAIL PROTECTED]

Reply via email to