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.
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.