Строковые массивы в c - PullRequest
       2

Строковые массивы в c

2 голосов
/ 06 сентября 2010

Я написал код для чтения файлов

Что не так в следующем коде, я всегда получаю последнее имя файла, если я печатаю любой arrayItem

#include <stdio.h>
#include <string.h>

char **get_files()
{
    FILE *fp;
    int status;
    char file[1000];
    char **files = NULL;
    int i = 0;
    /* Open the command for reading. */
    fp = popen("ls", "r");
    if (fp == NULL) {
        printf("Failed to run command\n" );
        //exit;
    }

    while (fgets(file, sizeof(file)-1, fp) != NULL) {

        files = (char **)realloc(files, (i + 1) * sizeof(char *));
        //files[i] = (char *)malloc(sizeof(char));
        files[i] = file;
        i++;        
    }
    printf("%s", files[0]);
    return files;
}

int main()
{
char **files = NULL;
int i =0 ;
files = get_files("");

}

Ответы [ 5 ]

2 голосов
/ 06 сентября 2010

вы должны использовать

files[i] = strdup(file);

вместо

files[i] = file;

Вторая версия позволяет только files[i] указывать на ваш буфер чтения, который всегда одинаков. Со следующим fgets вы перезапишете содержимое file и, следовательно, содержимое file[i], которые фактически указывают на то же место в памяти. Фактически, в конце все ваши file[0] .. file[n] будут указывать на то же местоположение, что и file.

С помощью strdup(..) вы выделяете новый буфер и копируете туда содержимое file.

1 голос
/ 07 сентября 2010

pclose отсутствует для вашего popen.Попен это только POSIX, а не C89 / C99.Нет проверки выделения памяти в примере, это ваша работа; -)

#include <stdio.h>
#include <stdlib.h>

char **get_files(char **list)
{
  FILE *fp;
  char file[1000];
  int i=1;
  /* Open the command for reading. */
  fp = popen("ls -l", "rt");
  if( !fp )
    perror("Failed to run command\n" ),exit(1);

  while( fgets(file, sizeof file , fp) ) {

    list = realloc(list, ++i * sizeof*list );
    memmove( list+1, list, (i-1)*sizeof*list);
    *list = strcpy( malloc(strlen(file)+1), file);
  }
  pclose( fp );
  return list;
}

main()
{
  char **files = get_files(calloc(1,sizeof*files)), **start=files;
  while( *files )
  {
    puts(*files);
    free(*files++);
  }
  free(start);
  return 0;
}
1 голос
/ 06 сентября 2010

Вы повторно используете массив file. После того, как вы прочитали имя файла, вам нужно использовать strdup, чтобы взять его копию и поместить эту копию в массив files. В противном случае каждый элемент в files просто указывает на одну и ту же строку.

1 голос
/ 06 сентября 2010

Вызов popen () для 'ls' - плохой способ сделать это. Посмотрите на opendir (), readdir (), rewinddir () и closedir ().

0 голосов
/ 06 сентября 2010

Ваш массив в char-файле [1000] имеет одно измерение, независимо от того, как вы перераспределяете память (если я не пропускаю что-то очевидное).Если вы читаете неизвестное количество файлов, то, вероятно, лучше всего использовать связанный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...