strtok () не дает вам новую строку.
Он искажает входную строку, вставляя символ '\ 0' там, где был символ разделения.
Таким образом, использование strcat (token [j], "/") поместит символ '/' там, где был '\ 0'.
Также последний маркер начнет добавлять «который» после окончания выделенной памяти в неизведанную память.
Вы можете использовать strtok (), чтобы разбить строку на куски. Но если вы хотите что-то добавить к токену, вам нужно сделать копию токена, в противном случае то, что вы добавите, будет перетекать на следующий токен.
Кроме того, вам нужно больше заботиться о распределении памяти, вы теряете память повсюду: -)
PS. Если вы должны использовать C-Strings. используйте strdup () для копирования строки.
char* prependPath( char* exeName )
{
char* path = getenv("PATH");
char* pathDeepCopy = strdup(path);
char* token[80];
int j, i; // used to iterate through array
token[0] = strtok(pathDeepCopy, ":");
for(i = 0;(token[i] != NULL) && (i < 80);++i)
{
token[i] = strtok(NULL, ":");
}
for(j = 0; j <= i; ++j)
{
char* tmp = (char*)malloc(strlen(token[j]) + 1 + strlen(exeName) + 1);
strcpy(tmp,token[j]);
strcat(tmp,"/");
strcat(tmp,exeName);
printf("%s\n",tmp); //print out all of the tokens
free(tmp);
}
free(pathDeepCopy);
}