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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2007, 11:04   #1
Adamant
Пользователь
 
Аватар для Adamant
 
Регистрация: 20.09.2007
Сообщений: 99
Вопрос Инициализация массива указателей. Непонятно !!!

Например в файле 1.txt записаны 4 строки:

аааааааааааааа
бббббббббббббб
вввввввввввввв
ггггггггггггггггггг
Код:
FILE *fp;
char str[256], *s[1000];
int i = 0;
............
............
while( !feof( fp ) )
   {
      if( fgets( str, 255, fp ) != NULL )
        {
           s[i] = str;
           puts( str );                      // проверка построчного присвоения
           printf("s[%d]:  %s", i, s[i] );  // выводит все правильно
           i++;
        }
   }
// а если здесь вывести :
puts( s[0] );     //  все
puts( s[1] );    //   указатели
puts( s[2] );   //    почему-то 
puts( s[3] );  //     содержат строку :  "гггггггггггггггггг"
Собратья кодеры, подскажите в чем дело?
С уважением Вячеслав.
Голова человеку дадена - не токмо шапку носить!
Adamant вне форума Ответить с цитированием
Старый 05.11.2007, 15:43   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Всё правильно. Каждый элемент массива s указывает на одну и ту же область памяти: массив str, т.е. содержимое элементов массива s равно содержимому массива str. А точнее, тому, что считывается в последний раз.
Вот правильно работающий вариант.
Код:
FILE *fp;
char s[1000][256];
int i = 0;
............
............
while( !feof( fp ) )
   {
      if( fgets( s[i], 255, fp ) != NULL )
        {
           printf("s[%d]:  %s", i, s[i] );
           i++;
        }
   }

puts( s[0] );    
puts( s[1] );    
puts( s[2] );   
puts( s[3] );
Carbon вне форума Ответить с цитированием
Старый 05.11.2007, 16:22   #3
Adamant
Пользователь
 
Аватар для Adamant
 
Регистрация: 20.09.2007
Сообщений: 99
По умолчанию

Уважаемый Carbon, я тоже пробовал в начале вариант,
у меня (C++ Builder X) он выдает ошибку. Мне подсказали :
Код:
while( !feof( fp ) )
   {
      if( fgets( str, 255, fp ) != NULL )
         {
           s[i] = new char[256];
           strcpt(s[i], str);
           puts( str ); // проверка построчного присвоения
           printf("s[%d]: %s", i, s[i] ); // выводит все правильно
           i++;
        }
   }
Голова человеку дадена - не токмо шапку носить!
Adamant вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что то непонятно sergei64_89 Общие вопросы C/C++ 9 25.05.2008 16:58
массив указателей на методы класса? cout Общие вопросы C/C++ 2 08.05.2008 09:43
Массив указателей на структуры SNAKE89 Общие вопросы C/C++ 4 27.12.2007 10:14
Инициализация окна Anny Общие вопросы Delphi 9 13.03.2007 11:48