【问题标题】:How can I return an array of strings in an ANSI C program?如何在 ANSI C 程序中返回字符串数组?
【发布时间】:2010-08-24 00:10:24
【问题描述】:

如何在 ANSI C 程序中返回字符串数组?

例如:

#include<stdio.h>

#define SIZE 10

char ** ReturnStringArray()
{
    //How to do this?
}

main()
{
    int i=0;

    //How to do here???

    char str ** = ReturnStringArray();

    for(i=0 ; i<SIZE ; i++)
    {
        printf("%s", str[i]);
    }
}

【问题讨论】:

    标签: c arrays string pointers c89


    【解决方案1】:

    您可以执行以下操作。为简洁起见省略了错误检查

    char** ReturnStringArray() {
      char** pArray = (char**)malloc(sizeof(char*)*SIZE);
      int i = 0;
      for ( i = 0; i < SIZE; i++ ) {
        pArray[i] = strdup("a string");
      }
      return pArray;
    }
    

    请注意,您需要相应地释放返回的内存。

    此外,在您的 printf 调用中,您可能希望在字符串中包含 \n 以确保刷新缓冲区。否则字符串将排队,不会立即打印到控制台。

    char** str = ReturnStringArray();
    for(i=0 ; i<SIZE ; i++)
    {
        printf("%s\n", str[i]);
    }
    

    【讨论】:

    • 您未能修复代码错误,因此我的 -1.... 查看 char str ** = ..... 行:P
    • 请不要在 C 中转换 malloc 的返回值,否则您将无法捕捉到缺少包含原型的情况
    • 你没有检查 malloc 可能会返回 NULL,如果 SIZE > INT_MAX,我会换行并导致索引越界。
    【解决方案2】:

    这样做

    #include<stdio.h>
    
    #define SIZE 10
    
    char ** ReturnStringArray()
    {
        //How to do this?
        char **strList = (char **)malloc(sizeof(char*) * SIZE);
        int i = 0;
        if (strList != NULL){
             for (i = 0; i < SIZE; i++){
                 strList[i] = (char *)malloc(SIZE * sizeof(char) + 1);
                 if (strList[i] != NULL){
                    sprintf(strList[i], "Foo%d", i);
                 }
             }
        }
        return strList;
    }
    
    main()
    {
        int i=0;
    
        //How to do here???
    
        char **str = ReturnStringArray();
    
        for(i=0 ; i<SIZE ; i++)
        {
            printf("%s", str[i]);
        }
    }
    
    • 问题 1:您的双指针声明不正确
    • 问题2:你需要知道双指针中每个指针的字符串大小..
    • 问题 3:你有责任在完成后释放内存..

    上面的代码示例假设字符串的最大大小不会超过SIZE的值,即10个字节的长度...

    不要超出双指针的边界,否则会崩溃

    【讨论】:

    • 我也做过同样的事情。但是在 main() 我正在写:- for(i=0 ; i
    • @JMSA: for(i=0 ; i&lt;SIZE ; i++) { printf("%s",ReturnStringArray()[i]); } - 该代码是非法的,并且不起作用......也就是说,带有数组下标的函数不是正确的方法:)
    【解决方案3】:

    请不要对 malloc 的返回进行类型转换,您没有包含&lt;stdlib.h&gt;,并且正如上面有人指出的那样,缺少原型将导致 int 被转换为 char **。不小心你的程序可能会也可能根本不会运行。

    【讨论】:

    • 但是这个问题甚至没有使用malloc?这似乎根本无法回答问题。
    • 我的错,我参考的是 tommieb 帖子。
    猜你喜欢
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2012-01-14
    • 2014-12-18
    相关资源
    最近更新 更多