Поскольку вы пропусканием адресtest
в test_func
, в test_func
, вы должны обрабатывать *dest
в качестве указателя, а не dest
. Например, после прохождения &test
через параметр char **dest
, необходимо выделить пространство для значения из dest
не сам dest
:
*dest = malloc (sizeof **dest * (len + 1));
Вот что ouah имел в виду, когда он заявил:
/* change the body accordingly to new dest type */
Я думаю, что ваш код должен работать после этого изменения. Если вы столкнетесь с дополнительными вопросами, здесь немного другой вариант на ваш подход, который можно сделать из:
#include <stdio.h>
#include <stdlib.h>
int test_func (char **dest, char *src, char delim);
int main (void)
{
int msg_length = 0;
char *test = NULL;
char *msg_full = "100000\nis hhhhhhhh";
msg_length = test_func (&test, msg_full, '\n');
printf ("\n value of test = '%s' (%d chars)\n\n", test, msg_length);
if (test) free (test); /* free allocated memory */
return 0;
}
/* copy characters in 's' following 'delim' to
newly allocated block of memory in 'str' */
int test_func (char **dest, char *src, char delim)
{
size_t len = 0;
char *p = src;
char *new = NULL;
/* set p at start of second string, save pointer
to start of second in new */
while (*p) if (*p++ == delim) break;
new = p;
while (*p++) len++; /* length of new */
*dest = malloc (sizeof **dest * (len + 1)); /* allocate */
p = new; /* set p to new */
new = *dest; /* set new to dest */
while (*p) { *new = *p++; new++; } /* copy to *dest */
return (int)len;
}
Выход
$ ./bin/splitintwo
value of test = 'is hhhhhhhh' (12 chars)
последнее примечание: (может быть, 2), обратите внимание на ваши типы данных. (это важно). Я оставил типы возвращаемых функций как int
, а также msg_length
в вашем коде, но они должны быть действительно unsigned int
(или более правильно size_t
). Зачем? Вы не можете иметь отрицательную длину. Получите привычку сопоставлять свой type
с информацией, которую вы обрабатываете. Это становится все более важным, чем дальше вы продвигаетесь в C.
main
- специальная функция с требуемым объявлением.Это тип 'int'
, то есть он должен вернуть значение (даже если MS позволит вам уйти без него). Он должен быть объявлен с обязательными параметрами (int argc, char **argv)
, хотя для коротких фрагментов я не всегда делаю это (о чем свидетельствует код выше). Если вы не дадите полное объявление, по крайней мере, прямо сообщите компилятору, что вы делаете (например, int main (void)
). Хотя не технически правильно, он намного чище, чем просто предоставление пустых парен.
Также в test_func изменить dest = src + i; to * dest = src + i; –
Я пробовал, но он возвращает null в вызывающей функции –