2016-12-31 12 views
1

Я столкнулся с проблемами при назначении строкового значения в массиве символов. Каждый раз, когда он присваивает строковое значение определенной позиции массива символов. Это значение позиции в массиве становится инициализированным пустой строкой после получения нового значения в строковой переменной. Я пытался сделать это, но тщетно. Ниже приведен код, который я использую:Символ Constant Array инициализируется пустой строкой, когда строковая переменная получает новое значение в C++

 const char *array[40]; 
     string line=""; 
     ifstream myfile("text.txt"); 
     if (myfile) 
      { 
      int in=0; 
      while (getline(myfile, line)) 
      { 

       array[in]=line.data(); 
        in++; 
      } 
      myfile.close(); 
      } 
     else return; 

Теперь переменная массива имеет все пустые строковые значения. Пожалуйста, дайте мне знать, как я могу это сделать?

+3

Подумайте о том, что указатели в точке массива к: – juanchopanza

+3

Вы, наверное, хотите 'STD :: Вектор массив;' (подсказка у вас есть только один строковый объект.). – Jarod42

+2

У вас проблемы, если файл содержит более 40 строк. – PaulMcKenzie

ответ

0

Вы получаете доступ к буферам внутренних данных string объекта line и пусть array[in] указывают на него. При чтении следующей строки этот буфер либо перезаписывается, либо может указывать на другое место памяти, так что ранее написанный array[in] указывает на память, которая была перезаписана новым контентом или вообще недействительна.

Если вы хотите использовать const char*[...] массив, скопировать в буфер первым:

array[in]= strdup(line.c_str()); 

указаний, что line.data() дает массив, но без гарантии терминатора 0x0 в конце. Смотрите документацию string::data() в cppreference.com

+0

Поблагодарите Stephan за помощью. –

+0

Добро пожаловать. Если это ответит на ваш вопрос, пожалуйста, не забудьте пометить вопрос как принятый. Благодаря! –

+0

Я попытался принять ответ, но система не позволяет мне это делать из-за менее 15 репутации –