C strtok не может получить 2 токена Borland

#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() завершается сбоем, когда он вставляет нулевой символ в строку.