Lookup the strtok() function. The documentation says that the input string is modified by the function. The first case copies the string literal into the char array, but the second one doesn't create a modifyable copy of the string literal. Instead, case 2 just makes a char pointer point to the string literal, and string literals cannot be changed by code, meaning you cannot call strtok() with a constant string literal like you do in case 2.
Also note that strtok() is not thread safe and cannot handle more one string at a time (you cannot tokenize two strings in a single loop). I don't know if strtok_s() is Microsoft-specific or not, but it is the preferred option.