Как я могу вернуть массив строк в программе ANSI C? - PullRequest
2 голосов
/ 24 августа 2010

Как я могу вернуть массив строк в программе 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]);
    }
}

Ответы [ 3 ]

3 голосов
/ 24 августа 2010

Вы можете сделать следующее.Проверка ошибок для краткости опущена

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]);
}
2 голосов
/ 24 августа 2010

Сделай так

#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 байтов в длину ...

Не выходите за границы двойного указателя, так как он упадет

1 голос
/ 30 августа 2010

Пожалуйста, не указывайте при возврате malloc, вы не включили <stdlib.h> и, как кто-то указал выше, отсутствие прототипа приведет к приведению int к char **.Случайно ваша программа может работать или не работать вообще.

...