Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2011, 15:38   #1
Kveigs
 
Регистрация: 14.05.2011
Сообщений: 5
По умолчанию Проблема с массивом строк

Здравствуйте! Пытаюсь записать в массив строк содержимое директории.. Всё содержимое находит, но на выходе весь массив почему-то заполнен именем последней папки директории..

Код:
WIN32_FIND_DATAA FindFile;
        HANDLE hFile;
        LPSTR szPATH;
char* tmpDirs[20];
        printf("--------------------------------------------------------------------------------");
        char s[10]="\\*.*";
        strcat(main_dir,s);
        for(int i=0; i<20; i++)
                tmpDirs[i]=0;
        hFile = FindFirstFileA(main_dir, &FindFile);
        
                int kFile = 0;
 
                if (hFile != INVALID_HANDLE_VALUE)
                {
                        do
                        { 
                                kFile++;
                                if (kFile > 2)
                                {
                                    tmpDirs[kFile-3] = FindFile.cFileName;
                                    printf("[%d]%s\n", kFile-3, tmpDirs[kFile-3]);//Здесь выводит все нормально (5 имен разных папок)
                                }
                        }
                        while(FindNextFileA(hFile, &FindFile) != 0);
                }else
                {
                        FindClose(hFile);
                        return FALSE;
                }
                FindClose(hFile);
        
        printf("--------------------------------------------------------------------------------");
        printf("\n");
        for(int i=0; i<20; i++)
        {
                printf("%s", tmpDirs[i]);//!!!а здесь 5 (в каталоге у меня 5 папок) раз выводит имя последней папки(((
        }



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 18.07.2011 в 17:10.
Kveigs вне форума Ответить с цитированием
Старый 18.07.2011, 19:29   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Все очень просто!
Код:
tmpDirs[kFile-3] = FindFile.cFileName;
Вы присваиваете каждому элементу массива указателей tmpDirs указатель одной переменной FindFile.cFileName.
Чтобы у вас все получилось нужно выделить память для хранения строк и скопировать найденный элемент в эту память:
Код:
char* tmpDirs[20];

for(int i=0; i<20; i++)
     tmpDirs[i]=(char*)malloc(256*sizeof(char));
 
     if (hFile != INVALID_HANDLE_VALUE)
     {
           do
           { 
                  kFile++;
                  if (kFile > 2)
                  {
                         strcpy(tmpDirs[kFile-3],FindFile.cFileName);
                         printf("[%d]%s\n", kFile-3, tmpDirs[kFile-3]);//Здесь выводит все нормально (5 имен разных папок)
                   }
             }while(FindNextFileA(hFile, &FindFile) != 0);
     }
counter вне форума Ответить с цитированием
Старый 18.07.2011, 20:19   #3
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Kveigs Посмотреть сообщение
З
Код:
WIN32_FIND_DATAA FindFile;
        HANDLE hFile;
        LPSTR szPATH;
char* tmpDirs[20];
        printf("--------------------------------------------------------------------------------");
        char s[10]="\\*.*";
        strcat(main_dir,s);
        for(int i=0; i<20; i++)
                tmpDirs[i]=0;
Хотел бы сделать некоторые замечания по коду.
Во-первых, вы можете инициализировать весь массив tmpDirs при его инициализации и, тем самым, сэкономить на написании цикла

for(int i=0; i<20; i++)
tmpDirs[i]=0;

В С+ это можно сделать следующим образом

char* tmpDirs[20] = {};

Кроме того совершенно не понятно, зачем вы объявили массив s с размерностью 10, если, как я понимаю, он у вас в программе не модифицируется. Лучше было объявить следующим образом

const char *s = "\\*.*";
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с массивом... СтуденткаПитер Помощь студентам 3 09.06.2011 00:11
Проблема с массивом Moderntoss Общие вопросы C/C++ 4 21.04.2011 21:52
Проблема с массивом @Ivan Общие вопросы C/C++ 2 11.10.2010 11:46
файл с массивом строк, помогите найти ошибку LyaLyaLya Паскаль, Turbo Pascal, PascalABC.NET 7 26.12.2008 23:44
C++.Работа с массивом строк. Очень срочно=( NamelessEndless Помощь студентам 1 29.05.2008 20:08