#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. В этом есть смысл.