I needed to do this for GNOME bug 453678, and it wasn’t very obvious. In the end I thought of a way, and I’ve tested it with gcc on GNU/Linux and HP C on OpenVMS to make sure it wasn’t just a GNU thing. (No, this doesn’t imply that I’m introducing a policy of building Metacity on OpenVMS in future.)
GEIN $ type test.c #include <stdio.h> #include <string.h> void check(char *string) { int workspace = -1; int chars = 0; sscanf (string, "Workspace %d%n", &workspace, &chars); printf ("Input is [%s], workspace number is %d, fully=%s\n", string, workspace, *(string+chars)=='\0'?"Yes":"No"); } int main(int argc, char**argv) { check ("Workspace 1 is very nice"); check ("Workspace 2"); check ("I like beer"); } GEIN $ cc test GEIN $ link test GEIN $ run test Input is [Workspace 1 is very nice], workspace number is 1, fully=No Input is [Workspace 2], workspace number is 2, fully=Yes Input is [I like beer], workspace number is -1, fully=No GEIN $
OpenVMS testing courtesy of gein.vistech.net .
You could also use the fact that sscanf returns the number of fields successfully read. Put a dummy %c at the end of the format and check that
the result is equal to the number of % fields before it:
void
check(char *string)
{
char dummy;
int workspace ;
int NB_FIELD=1 ;
int nb = sscanf (string, “Workspace %d%c”, &workspace, &dummy);
printf (“Input is [%s], fully=%s\n”,
string, (nb==NB_FIELD) ? “Yes”:”No”);
}
Or you could just check sscanf return value ?
Ah, I did spend a bit of time thinking about using the return value, but I hadn’t thought of the idea of using the dummy variable. Seems kind of obvious now you point it out :) Thanks.