значение getenv () не работает в strtok () - PullRequest
0 голосов
/ 11 мая 2018
char *p = strtok (argv[1], ",")    #  Works perfectly
char *p = strtok (getenv("somestring"), ","); # does not work

В моей программе я принимаю значение argv [1] , которое передается в формате "x, y" .когда argv [1] не задан, моя программа должна принимать значение из
getenv ("somestring") , которое также возвращает "x, y" , после чего я их анализируюиспользуя стрток.

Я не понимаю, почему argv [1] и getenv () ведут себя одинаково, поскольку они оба имеют одинаковый тип данных, если я не ошибаюсь

1 Ответ

0 голосов
/ 11 мая 2018

Из заметок в getenv руководство:

Как обычно реализуется, getenv () возвращает указатель на строку в списке среды. Звонящий должен заботиться не изменить эту строку, так как это изменит среду процесса.

Поскольку strtok изменяет строку, вы должны скопировать строку, возвращаемую getenv, а затем вызвать strtok, используя копию:

char *str, *ptr;
char *p = getenv("somestring");
str = malloc(strlen(p) + 1);
strcpy(str, p);
ptr = strtok(str, ",");

// Make sure to deallocate the memory once you are done using it.
free(str);

Вы также можете использовать strdup:

char *str, *ptr;
char *p = getenv("somestring");
str = strdup(p);
ptr = strtok(str, ",");

// Make sure to deallocate the memory once you are done using it.
free(str);
...