如何返回C语言中的列表?

如何返回C语言中的列表?,c,C,我试图用*分割字符串,并返回分割后的字符串,如下所示 abc*d*efg*hijk -> [abc,d,efg,hijk] 这是我的代码,其中*pattern是给定的字符串,我首先计算星号(cnt)的数量,并用长度cnt创建一个空列表。但它总是出错,我不明白。。。有人能帮我吗 错误消息 未使用计算的值(*star_cnt++;) 函数返回局部变量的地址(返回单位;) 第二个是我的主要错误。我无法返回列表 我觉得有很多地方不对劲,看一个工作示例可能会在这里有更多帮助 您可以尝试以下方法:

我试图用*分割字符串,并返回分割后的字符串,如下所示

abc*d*efg*hijk -> [abc,d,efg,hijk]
这是我的代码,其中*pattern是给定的字符串,我首先计算星号(cnt)的数量,并用长度cnt创建一个空列表。但它总是出错,我不明白。。。有人能帮我吗

错误消息

  • 未使用计算的值(*star_cnt++;)
  • 函数返回局部变量的地址(返回单位;) 第二个是我的主要错误。我无法返回列表

  • 我觉得有很多地方不对劲,看一个工作示例可能会在这里有更多帮助

    您可以尝试以下方法:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stddef.h>
    #include <string.h>
    
    /**
     * @fn Slice()
     * @param [IN] pattern  - pointer to string to be analysed
     * @param 
     * @return pointer to array for strings, array is terminated by NULL
     * */
    char** Slice(char *pattern) {
    
      char *star_cnt;
      int cnt;
      char** resultlist;
    
      star_cnt = pattern;
      cnt = 0;
    
      while (*star_cnt != '\0') {
        if (*star_cnt == '*') {
          cnt++;
        }
        star_cnt++;
      }
    
      printf("%d items\n",cnt+1);
    
      resultlist = malloc(sizeof(char*) * (cnt+2));
      memset(resultlist,0,sizeof(char*) * (cnt+2));
      star_cnt = pattern;
    
      cnt = 0;  
      resultlist[cnt] = star_cnt;
      //printf("item %d: %s\n",cnt,resultlist[cnt]);
      cnt++;
      while (*star_cnt != '\0') {
        if (*star_cnt == '*') {
          *star_cnt = '\0';
          resultlist[cnt] = star_cnt+1;
          //printf("item %d: %s\n",cnt,resultlist[cnt]);
          cnt++;
        }
        star_cnt++;
      }
      return resultlist;
    }
    
    int main()
    {
      char working_string[] = "abc*d*efg*hijk";
      char* backup_string = strdup(working_string);
      char** list = NULL;
       
      list = Slice(working_string);
      int i;
    
      i = 0;
      if (list != NULL)
      {
        while(list[i] != NULL)
        {
            printf("%d : %s\n",i,list[i]);
            i++;
        }
        free(list);
      }
    
      printf("original_string = %s\n",backup_string);
      free(backup_string);
    }
    
    4 items
    0 : abc
    1 : d
    2 : efg
    3 : hijk
    original_string = abc*d*efg*hijk
    

    Slice函数基本上返回一个指向char*字符串的指针,数组列表在最后一个元素中以NULL结尾。请记住,在此解决方案中,原始字符串已被修改,因此无法再次使用。

    为了存储和返回结果,您还可以定义字符串容器,如:

    struct c_str_container{
        char **arr;
        size_t size;
    };
    
    然后您可以定义诸如
    init_c_stru_container
    add_element_to_c_stru container
    free_c_stru container
    之类的函数来处理容器

    然后,您可以使用using函数编写
    substrings
    函数,以查找分隔符并将字符串拆分为子字符串

    最后,您可以使用此函数创建容器,然后在显示来自容器的结果(以及可能对容器执行其他操作)后,通过预定义函数
    free_c_str_container
    释放分配的内存:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct c_str_container{
        char **arr;
        size_t size;
    };
    
    void init_c_str_container(struct c_str_container *container){
        container->arr = NULL;
        container->size = 0;
    }
    
    int add_element_to_c_str_container(struct c_str_container *container, const char *txt, size_t length){
        char **newarr = (char **) realloc(container->arr, (container->size + 1) * (sizeof(char *)));
        if(!newarr){
            newarr =  (char **) malloc((container->size + 1) * (sizeof(char *)));
            if(!newarr){
                return -1;
            }else{
                for(size_t counter = container->size; counter--;){
                    newarr[counter] = container->arr[counter];
                }
                if(container->size){
                    free(container->arr);
                }
            }
        }
        newarr[container->size] = malloc((length + 1) * sizeof(char));
        memcpy(newarr[container->size], txt, length);
        newarr[container->size][length] = '\0';
        container->arr = newarr;
        ++container->size;
        return 0;
    }
    
    void free_c_str_container(struct c_str_container *container){
        for(size_t counter = container->size; counter--;){
            free(container->arr[counter]);
        }
        free(container->arr);
        container->size = 0;
    }
    
    
    struct c_str_container substrings(const char *input, const char delimiter){
        const char *input_end = input + strlen(input);
        struct c_str_container container;
        init_c_str_container(&container);
    
        while(strchr(input, delimiter) == input){
            ++input;
        }
    
        const char *end_point;
        while((end_point = strchr(input, delimiter))){
            add_element_to_c_str_container(&container, input, (end_point - input));
            while(strchr(end_point, delimiter) == end_point){
                ++end_point;
            }
            input = end_point;
        }
    
        if(input < input_end){
            add_element_to_c_str_container(&container, input, (input_end - input));
        }
    
        return container;
    }
    
    int main(void) {
    
        struct c_str_container container = substrings("***as***we*grow*up", '*');
    
        printf("number of elements is : %zu\n", container.size);
        for(size_t counter = 0; counter < container.size; ++counter){
            printf("element %zu is : %s\n", counter, container.arr[counter]);
        }
        free_c_str_container(&container);
        printf("now elements are : %zu\n", container.size);
    
        return EXIT_SUCCESS;
    }
    

    *星形_cnt=*图案这是未定义的行为
    star\u cnt
    是一个未初始化的指针。与
    *单元=*模式相同它不断得到错误。显示实际错误是有意义的。问题包括错误,并提供完整的代码作为参考。确保您还提供了准确的输入、预期结果和实际结果。不要在要求“以C语言返回列表”的问题上加上标签。如果你想返回一个字符串数组,看看
    main
    是如何接收参数的-它就是一个字符串数组。。。类似于:
    char**func(…)
    Jin000000:您可能希望使用一个包含所有警告和调试信息的最新编译器:
    gcc-Wall-Wextra-g
    。代码没有警告后,使用调试器更好地了解可执行文件的行为。你也可以下载然后研究灵感的源代码现有的喜欢和阅读我想改变这段代码,以不修改原始字符串,我尝试了几个选项。我个人最好的尝试是pattern\u copy=strcpy(pattern\u copy,pattern);列表=切片(模式复制),但这给了我一个错误。。。您介意给我一些关于更改代码的提示吗?根据[修改字符串文字在C中是无法识别的行为。请删除您的答案或更正它。@Jin000000根据[修改字符串文字在C中是无法识别的行为。此答案可能有效,但不是正确答案。请拒绝此答案。我真的很抱歉,我的错,它看起来好像
    char test[]=“abc*d*efg*hijk”;“
    是可变的。我想更改我的投票,但系统不允许这样做,除非您编辑您的答案。因此,请编辑它,以便我可以反转我的投票。@Jin000000我真的很抱歉,我的错,看起来好像
    char test[]=“abc*d*efg*hijk”;”
    是可变的。
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct c_str_container{
        char **arr;
        size_t size;
    };
    
    void init_c_str_container(struct c_str_container *container){
        container->arr = NULL;
        container->size = 0;
    }
    
    int add_element_to_c_str_container(struct c_str_container *container, const char *txt, size_t length){
        char **newarr = (char **) realloc(container->arr, (container->size + 1) * (sizeof(char *)));
        if(!newarr){
            newarr =  (char **) malloc((container->size + 1) * (sizeof(char *)));
            if(!newarr){
                return -1;
            }else{
                for(size_t counter = container->size; counter--;){
                    newarr[counter] = container->arr[counter];
                }
                if(container->size){
                    free(container->arr);
                }
            }
        }
        newarr[container->size] = malloc((length + 1) * sizeof(char));
        memcpy(newarr[container->size], txt, length);
        newarr[container->size][length] = '\0';
        container->arr = newarr;
        ++container->size;
        return 0;
    }
    
    void free_c_str_container(struct c_str_container *container){
        for(size_t counter = container->size; counter--;){
            free(container->arr[counter]);
        }
        free(container->arr);
        container->size = 0;
    }
    
    
    struct c_str_container substrings(const char *input, const char delimiter){
        const char *input_end = input + strlen(input);
        struct c_str_container container;
        init_c_str_container(&container);
    
        while(strchr(input, delimiter) == input){
            ++input;
        }
    
        const char *end_point;
        while((end_point = strchr(input, delimiter))){
            add_element_to_c_str_container(&container, input, (end_point - input));
            while(strchr(end_point, delimiter) == end_point){
                ++end_point;
            }
            input = end_point;
        }
    
        if(input < input_end){
            add_element_to_c_str_container(&container, input, (input_end - input));
        }
    
        return container;
    }
    
    int main(void) {
    
        struct c_str_container container = substrings("***as***we*grow*up", '*');
    
        printf("number of elements is : %zu\n", container.size);
        for(size_t counter = 0; counter < container.size; ++counter){
            printf("element %zu is : %s\n", counter, container.arr[counter]);
        }
        free_c_str_container(&container);
        printf("now elements are : %zu\n", container.size);
    
        return EXIT_SUCCESS;
    }
    
    number of elements is : 4
    element 0 is : as
    element 1 is : we
    element 2 is : grow
    element 3 is : up
    now elements are : 0