Liste des Groupes | Revenir à cu shell |
cross@spitfire.i.gajendra.net (Dan Cross) writes:In article <87cyinrt5s.fsf@doppelsaurus.mobileactivedefense.com>,>
Rainer Weikusat <rweikusat@talktalk.net> wrote:scott@slp53.sl.home (Scott Lurndal) writes:>Rainer Weikusat <rweikusat@talktalk.net> writes:>
[...]
>>Something which would match [0-9]+ in its first argument (if any) would>
be:
>
#include "string.h"
#include "stdlib.h"
>
int main(int argc, char **argv)
{
char *p;
unsigned c;
>
p = argv[1];
if (!p) exit(1);
while (c = *p, c && c - '0' > 10) ++p;
if (!c) exit(1);
return 0;
}
>
but that's 14 lines of text, 13 of which have absolutely no relation to
the problem of recognizing a digit.
Personally, I'd use:
>
$ cat /tmp/a.c
#include <stdint.h>
#include <string.h>
>
int
main(int argc, const char **argv)
{
char *cp;
uint64_t value;
>
if (argc < 2) return 1;
>
value = strtoull(argv[1], &cp, 10);
if ((cp == argv[1])
|| (*cp != '\0')) {
return 1;
}
return 0;
}
This will accept a string of digits whose numerical value is <=
ULLONG_MAX, ie, it's basically ^[0-9]+$ with unobvious length and
content limits.
He acknowledged this already.
>return !strstr(argv[1], "0123456789");>
>
would be a better approximation,
No it wouldn't. That's not even close. `strstr` looks for an
instance of its second argument in its first, not an instance of
any character in it's second argument in its first. Perhaps you
meant something with `strspn` or similar. E.g.,
>
const char *p = argv[1] + strspn(argv[1], "0123456789");
return *p != '\0';
My bad.
Les messages affichés proviennent d'usenet.