There is no danger in his format string. The worst that can happen is the input is not a number, at which point *scanf terminates anyway.
Also, strtok() is not a very friendly alternative (as it is obnoxious to use and it destroys the input string). Everything can be done very easily using standard C++. And you are assuming that the entire string is by itself on a line (which it might not be). The only reason to go this route over directly reading the istream would be to separate the time of input and time of parsing.
Assuming input is always properly formatted or bust
1 2 3 4
unsignedint num[4];
char c; // throwaway var to catch '-'
cin >> num[0] >> c >> num[1] >> c >> num[2] >> c >> num[3];
if (!cin) fooey();
You can also use standard containers instead of an array or a collection of individual variables: