Использование strtok с указателем malloced для правильной строки

#c #string #pointers

Вопрос:

Я вижу множество примеров strtok с массивами, но не указатели на массив. Я взял один наугад и попытался угадать, как он должен работать. Это не. Почему это вызывает ошибку шины?

 #include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main () {
   char *str = malloc(16);
   memset(str, '', 16);
   str = "This - is - foo";

   const char s[2] = "-";
   char *token;
   
   /* get the first token */
   token = strtok(str, s);
   
   /* walk through other tokens */
   while( token != NULL ) {
      printf( " %sn", token );
    
      token = strtok(NULL, s);
   }
   
   return(0);
}
 

Комментарии:

1. Потому что это: str = "This - is - foo"; перезаписывает ваш указатель строковым литералом. Используйте strcpy вместо этого.

2. Я вижу разницу, я совсем забыл об этом.

3. Короткий ответ: не используйте strtok()

Ответ №1:

    char *str = malloc(16); // you allocate memory
   memset(str, '', 16);  // you set it to zero
   str = "This - is - foo";// you loose the reference to it assigning the pointer with the string literal reference
   // now str references string literal
   // as a bonus you got the memory leak as well
 

Что ты можешь сделать?:

    char *str = malloc(16);
   strcpy(str, "This - is - foo");
 

или просто

 char str[] = "This - is - foo";
 

или

 char *str = strdup("This - is - foo");
 

Комментарии:

1. В этом есть смысл.