c -将字符串数组传递给另一个函数



我有指针的困难,我想知道我们如何获得字符串数组的值与另一个函数使用指针?

我的代码是:
char *getName(const char *complete_name) {

char buffer[50];
strcpy(buffer, complete_name);

int i = 0;
char *p = strtok (buffer, ",");
char *array[2]; //array[0] = last name and array[1] = first name

while (p != NULL) {
array[i++] = p;
p = strtok (NULL, ",");
}

printf("%sn", array[0]); // last name
printf("%sn", array[1]); // first name
return *array;
}

和我的主要功能是:

int main() {
const char *patient = "Doe,John";  

char *p;
int i;
p = getName(patient);

for ( i = 0; i < 2; i++ ) {
printf("%sn", p[i]);
}

return 0;
}

我的目标是访问变量数组在我的主,我怎么能做到这一点?

谢谢你!

bufferarray是仅存在于函数内部的变量。因此返回指针(直接或间接使用指针)是非法的。

你有两个选择。

  1. 让函数分配动态内存

  1. 分配main中的内存并传递指向内存的指针

选项1:动态内存

可以是:

char **getName(const char *complete_name) {

char buffer[50];
strcpy(buffer, complete_name);

int i = 0;
char *p = strtok (buffer, ",");
char **array = calloc(2, sizeof *array);

while (i < 2 && p != NULL) {
array[i] = malloc(strlen(p) + 1);
strcpy(array[i], p);
++i;
p = strtok (NULL, ",");
}

if (array[0] != NULL) printf("%sn", array[0]); // last name
if (array[1] != NULL) printf("%sn", array[1]); // first name
return array;
}
int main() {
const char *patient = "Doe,John";  

char **p;
int i;
p = getName(patient);

for ( i = 0; i < 2 && p[i] != NULL; i++ ) {
printf("%sn", p[i]);
}

free(p[0]);
free(p[1]);
free(p);

return 0;
}

选项2:在main中分配并传递给函数的内存

void getName(const char *complete_name, char split[][50]) {

char buffer[50];
strcpy(buffer, complete_name);

int i = 0;
char *p = strtok (buffer, ",");

while (i < 2 && p != NULL) {
strcpy(split[i], p);
++i;
p = strtok (NULL, ",");
}

printf("%sn", split[0]); // last name
printf("%sn", split[1]); // first name
}
int main() {
const char *patient = "Doe,John"; 
char split[2][50] = { 0 };

int i;
getName(patient, split);

for ( i = 0; i < 2; i++ ) {
printf("%sn", split[i]);
}

return 0;
}

不能返回对局部变量的引用

char *getName(const char *complete_name) 
{
const char *end = complete_name;
char *name;
while(*end && *end != ',') end++;
name = malloc(end - complete_name + 1);
if(name)
{
memcpy(name, complete_name, end - complete_name);
name[end - complete_name] = 0;
}
return name;
}

int main(void)
{
char *str = "Doe,John";
char *name;
printf("%sn", name = getName(str));
free(name);
}

如果两者都需要:

char **getName(const char *complete_name) 
{
char *wrkname;
char **sname = calloc(sizeof*sname, 2);
if(sname)
{
char *wrkname = strdup(complete_name);
sname[0] = wrkname;
while(*wrkname && *wrkname != ',') wrkname++;
if(*wrkname)
{
*wrkname++ = 0;
if(*wrkname) sname[1] = wrkname;
}
}
else
{ /* handle memory error */}
return sname;
}

int main(void)
{
char *str = "Doe,John";
char **name = getName(str);

if(name)
{
if(name[0]) printf("Name: %sn", name[0]);
if(name[1]) printf("Surname: %sn", name[1]);
free(name[0]);free(name);
}
}

最新更新