2015-09-14 4 views
1

У меня есть программа с функцией, которую я должен предоставить как строку, так и аргумент и вернуть часть строки. Такое, что я хочу, чтобы вернуть указатель на функцию призваниюВозвращение указателя строки в C

int test_func(char *dest, const char *src) 
    { 
    int i,n,len_in_msg,j; 
    char *rem_string; 

    n=strlen(src); 
    for (i = 0; i < n && src[i] != '\n'; i++) 
     { 
     dest = src+i; 
     } 
    printf("value of i = %d ",i); 

    dest = dest+2; 
    printf("dest = %s", dest); 
    return 1; 
    } 

Здесь у меня есть строка, как "100000\nis hhhhhhhh"; я хочу, чтобы отделить "100000" и следующая строка таким образом, что я хочу, чтобы вернуть последнюю часть в качестве указателя в dest к вызывающая функция.

dest напечатан штраф в test_func(), однако он не отражается в функции вызова.

Даже я пытался дозвониться в

int main() 
{ 
    int msg_pointer = -1; 
    int msg_length; 
    char *test; 
    char *test1; 
    char *msg_full = "100000\nis hhhhhhhh"; 
    //test = malloc(sizeof(char)*(100)); 

    msg_length = test_func(test, msg_full); 

    printf("value of test = %s", test); 
} 

Также как &test, но не повезло. Как я могу это достичь?

ответ

3
char *test; 
/* ... */ 
msg_length = test_func(test,msg_full); 

Вы передаете test неинициализированная указатель на test_func. Если вы хотите изменить объект указатель, переданный в параметре, используйте указатель на указатель:

int test_func(char **dest, const char *src) 
{ 
    /* change the body accordingly to new dest type */ 
} 

и:

msg_length = test_func(&test,msg_full); 
+0

Также в test_func изменить dest = src + i; to * dest = src + i; –

+0

Я пробовал, но он возвращает null в вызывающей функции –

0

Поскольку вы пропусканием адрес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)). Хотя не технически правильно, он намного чище, чем просто предоставление пустых парен.

Смежные вопросы