#c #c builder #strtok
#c #c builder #strtok
Вопрос:
char *ParseCmdX(char *buf,int len)
{
char *p;
p = strtok(buf," ,");
p = strtok(NULL," ,");
char *ptr = (char *)malloc(strlen(p) 1);
strcpy(ptr,p);
return ptr;
}
Почему я получаю сообщение об ошибке нарушения доступа p = strtok(NULL," ,");
?
Когда я ставлю нулевой параметр, он ломается…
buf — это что-то вроде «das sdg hfg jgh»
Комментарии:
1. как выглядит значение в «buf»?
2. «das gfd jgh khh» — buf
3. @Hak вы пометили это как c , но вы используете такие вещи, как
malloc
,char *
иstrcpy
. Есть ли причина, по которой вы делаете это таким образом, вместо того, чтобы использовать строки и интеллектуальные указатели?
Ответ №1:
Как вы вызываете эту функцию и как выделяется buf? Помните, что buf не может быть доступен только для чтения или const (strtok изменяет входной буфер по мере его вызова).
Это работает, потому что x можно изменить:
char x[] = "das sdg hfg jgh";
char *c = ParseCmdX(x, strlen(x));
Это, однако, ошибка seg:
char *y = "das sdg hfg jgh";
char *c = ParseCmdX(y, strlen(y));
Ответ №2:
Вы должны проверить и посмотреть, вернул ли первый вызов strtok, а именно strtok(но, » ,») NULL или нет, если это так, то следующий вызов strtok завершится. что конкретно вы передаете в ParseCmdX в buf?
Комментарии:
1. почему он должен возвращать значение NULL ? если я введу строку типа «asd hfdkj gdhk fhjsk»,
2. Ахмед совершенно прав. для «das sdg hfg jgh» в нем нет » ,», поэтому p равно НУЛЮ. Как только p равно null, возвращать больше нечего, поэтому следующий вызов strtok будет удаляться от конца строки. Бах, Носовые демоны повсюду 🙂
3. Если запрошенный токен не найден, и нулевой ограничитель еще не достигнут,
strtok()
не возвращает NULL, он возвращает оставшуюся часть входной строки вплоть до нулевого ограничителя. Кроме того, второй параметрstrtok()
— это набор разделителей из 1 символа. В этом случае он будет искать' '
','
символы OR по отдельности.','
Символ не существует в строке, но' '
существует, поэтомуstrtok()
в любом случае не вернет значение NULL. Я думаю, Джо прав. Входная строка, вероятно, доступна только для чтения, поэтому strtok() завершается сбоем, когда он вставляет нулевой символ в строку.