Problematic code in K&R

G

Gregor H.

Hello C programmers,

in K&R (2nd edition) the authors published the following code for dealing with
command line arguments (p. 117):

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

while (--argc > 0 && (*++argv)[0] == '-')
while (c = *++argv[0])
switch (c) {
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("find: illegal option %c\n", c);
argc = 0;
found = -1;
break;
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In addition they give the following explanation of this part of the program:

"argc is decremented and argv is incremented before each optional argument.
[...] Notice that *++argv is a pointer to an argument string, so (*++argv)[0]
is its first character. (An alternate valid form would be **++argv.) Because
[] binds tighter than * and ++, the parentheses are necessary; without them
the expression would be taken as *++(argv[0]). In fact, that is what we have
used in the inner loop, where the task is to walk along a specific argument
string. In the inner loop, the expression *++argv[0] increments the pointer
argv[0]!" (p. 117)

Now it seems that this solution (for "walk[ing] along a specific argument
string" by using the construct "*++argv[0]") raised some criticism:

"The sample program increments argv[0]. Although argv is modifiable, and
argv[0][0] is modifiable (if argv[0] is not a null pointer), argv[0] is not
modifiable. (At least, not always.)" (Peter Seebacher)

"117 (§5.10): In the find example, the program increments argv[0]. This is not
specifically forbidden, but not specifically allowed either." (Source:
http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html)

Now here's my question: Would the following (slight modification of the
original code) be a reasonable (or at least correct) solution?:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

while (--argc > 0 && (*++argv)[0] == '-') {
char c, *arg = *argv;
while (c = *++arg)
switch (c) {
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("find: illegal option %c\n", c);
argc = 0;
found = -1;
break;
}
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


G.
 
G

Gregor H.

Slightly changed my code (for better agreement with the original one).
in K&R (2nd edition) the authors published the following code for dealing with
command line arguments (p. 117):

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

while (--argc > 0 && (*++argv)[0] == '-')
while (c = *++argv[0])
switch (c) {
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("find: illegal option %c\n", c);
argc = 0;
found = -1;
break;
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Now here's my question: Would the following (slight modification of the
original code) be a reasonable (or at least correct) solution?:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

while (--argc > 0 && (*++argv)[0] == '-') {
char *arg = *argv;
while (c = *++arg)
switch (c) {
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("find: illegal option %c\n", c);
argc = 0;
found = -1;
break;
}
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


G.
 

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

Similar Threads

Command Line Arguments 0
K&R 1-24 15
How can I view / open / render / display a pdf file with c code? 0
Processing command line arguments 5
C pipe 1
K&R 5-10 11
Print with command-line arguments 0
page 120 K&R 46

Members online

No members online now.

Forum statistics

Threads
473,994
Messages
2,570,223
Members
46,812
Latest member
GracielaWa

Latest Threads

Top