在C中返回字符串指针

时间:2015-09-14 18:25:31

标签: c pointers

我有一个带有函数的程序,我应该提供字符串as和argument并返回字符串的一部分。这样我想返回一个指向调用函数的指针

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中的指针返回给调用函数。< / p>

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但没有运气。我怎么能实现这个?

2 个答案:

答案 0 :(得分: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); 

答案 1 :(得分:0)

由于您在<{1}}内将 test地址传递给test_func,因此您必须将test_func视为指针,而不是{ {1}}。例如,在*dest通过参数dest之后,您必须为&test而不是char **dest本身的分配空间:

dest

当他说:

时,这就是他的意思
dest

我认为您的代码应该遵循该更改。如果您遇到其他问题,可以使用以下方法略微区分您的方法:

*dest = malloc (sizeof **dest * (len + 1));

<强>输出

/* change the body accordingly to new dest type */

最后一个注意:(可能是2),密切关注您的数据类型。 (这很重要)。我在代码中将函数返回类型保留为#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) ,但它们应该是int(或者更恰当msg_length)。为什么? 您的长度不能为负。养成将unsigned int与您正在处理的信息进行匹配的习惯。随着你在C中取得进一步发展,这将变得越来越重要。

size_t是一个特殊功能,带有必需的声明。它是类型type,意味着它必须返回一个值(即使MS让你在没有它的情况下离开)。它应该使用所需的参数main声明,即使对于简短的片段,我并不总是这样做(由上面的代码证明)。如果您不打算给出完整的声明,至少要明确告诉编译器您正在做什么(例如'int')。虽然不是技术上正确,但它比简单地提供空的parens要清晰得多。