2

如何在 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]);
    }
}
4

3 回答 3

3

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

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在字符串中包含 a 以确保刷新缓冲区。否则字符串将排队并且不会立即打印到控制台。

char** str = ReturnStringArray();
for(i=0 ; i<SIZE ; i++)
{
    printf("%s\n", str[i]);
}
于 2010-08-24T00:13:27.903 回答
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 个字节...

不要超出双指针的边界,因为它会崩溃

于 2010-08-24T00:18:06.170 回答
1

请不要对 malloc 的返回进行类型转换,您没有包括在内<stdlib.h>,并且正如上面有人指出的那样,缺少原型将导致 int 被转换为 char **。意外的是,您的程序可能会或可能根本无法运行。

于 2010-08-30T07:36:07.870 回答