我有一个带有函数的程序,我应该提供字符串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
但没有运气。我怎么能实现这个?
答案 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要清晰得多。