【问题标题】:Passing a string array to another function将字符串数组传递给另一个函数
【发布时间】:2021-12-12 01:06:55
【问题描述】:

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

我的代码是:

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("%s\n", array[0]); // last name
  printf("%s\n", 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("%s\n", p[i]);
  }
  
  return 0;
}

我的目标是在我的 main 中访问变量数组,我该怎么做?

谢谢!

【问题讨论】:

  • 为什么要同时标记 C 和 C++?
  • A char * 是一个指向字符的指针,对 c-string 指针有效。但是,您正在尝试获取指向 c 字符串数组的指针,因此您至少需要一个 char ** 作为 getName 的返回值。请注意,array 在技术上已经是 char **

标签: arrays c pointers


【解决方案1】:

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("%s\n", array[0]); // last name
  if (array[1] != NULL) printf("%s\n", 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("%s\n", 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("%s\n", split[0]); // last name
  printf("%s\n", 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("%s\n", split[i]);
  }
  
  return 0;
}

【讨论】:

  • 从技术上讲,您还有另一个选项可以将缓冲区和数组定义为 staticgetName 内。然后,即使超出直接范围,它们也会保持分配状态。
  • @infixed True 但这将是一个非常非常糟糕的解决方案
【解决方案2】:

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

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("%s\n", 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: %s\n", name[0]);
        if(name[1]) printf("Surname: %s\n", name[1]);
        free(name[0]);free(name);
    }
}

【讨论】:

  • @4386427 对。添加第二个代码
猜你喜欢
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多