2015-03-20 5 views
0

очень простой вопрос на C++. Выглядит, я действительно ржавеет там ... Все, что я хочу сделать, это прочитать массив из X строк из файла и создать массив из X вертикальных строк горизонтальных строк.
IE:
файл содержит:вопрос заполнить массив строк или массив char *

azert 
qsdfg 
wxcvb 
poiuy 
mlkjh 

Я хочу создать массив строк, содержащий:

aqwpm 
zsxol 
edcol 
rfvuj 
tgbyh 

Вот что я пытался до сих пор:

[bad code] 
const int SIZE = 37; 
    std::string table_h[SIZE]; 
    std::string table_v[SIZE]; 

int i = 0; 
    while (source >> table_h[i]) //,sizeof table_h[i] 
    { 
     for (int j = 0; j< SIZE; j++) 
     { 
      table_v[j][i] = table_h[i][j]; 
     } 
     i++; 
    } 

-> работы штраф для первой линии, ломается, когда i = 1. Я не понимаю, что. Я заметил, что хотя table_v[0][0] = 'f'; работает нормально. Оба table_v[0][36] = 'f'; и table_h[0].at(36); перерыв.

char * С (который был моей первой идеей),

char * table_h[SIZE]; 
char * table_v[SIZE]; 

что-то вроде

table_v[0][0] = 'f'; 

сразу ломается. Я полагаю, мне нужно выделить память или инициализировать что-то в первую очередь ??

Thx заранее.

+0

Если это вопрос на C++, вероятно, вы должны удалить тег C. Решение C++, скорее всего, не будет действительным C. – juanchopanza

ответ

1

Вы должны установить размер строк перед использованием operator [] для доступа к ним. Изменение размера table_h необязательно, но вам обязательно нужно изменить размер table_v.

const int SIZE = 37; 
    std::string table_h[SIZE]; 
    std::string table_v[SIZE]; 

    for (size_t i = 0; i < SIZE; ++i) 
    { 
     table_h[i].resize(SIZE); 
     table_v[i].resize(SIZE); 
    } 

    int i = 0; 
    while (source >> table_h[i]) 
    { 
     for (int j = 0; j < SIZE; j++) 
     { 
      table_v[j][i] = table_h[i][j]; 
     } 
     i++; 
    } 

См. working example.

На мой взгляд, если вы знаете размер строк, изменение размера лучше, чем добавление. Он может сэкономить некоторые перераспределения памяти, а IMHO - это просто более приятное решение.

1

Действительно, table_v[j] - пустая строка.

Строка должна выделять пространство для символов. Это не делается операторами индекса, т.е.

table_v[j][9] = 'a'; 

предполагает достаточное пространство выделяется для table_v[j].

Вы можете сделать append вашей строке, чтобы добавить к изначально пустой строке. Append не принимает символы, поэтому, вместо использования индекса table_h[i][j] вы можете использовать substr.

std::string to_append = table_j[i].substr(j, 1) 
table[j].append(to_append); 

Это также освобождает вас от i счетчика.

0

Вот показательная программа, которая показывает, как это можно сделать

#include <iostream> 
#include <vector> 
#include <string> 
#include <numeric> 

int main() 
{ 
    std::vector<std::string> v1 = 
    { 
     "azert", "qsdfg", "wxcvb", "poiuy", "mlkjh" 
    }; 

    for (const std::string &s : v1) std::cout << s << ' '; 
    std::cout << std::endl; 

    auto max_size = std::accumulate(v1.begin(), v1.end(), 
            size_t(0), 
            [](size_t acc, const std::string &s) 
            { 
             return acc < s.size() ? s.size() : acc; 
            }); 

    std::vector<std::string> v2(max_size); 

    for (const std::string &s : v1) 
    { 
     for (std::string::size_type i = 0; i < s.size(); i++) 
     { 
      v2[i].push_back(s[i]); 
     } 
    } 

    for (const std::string &s : v2) std::cout << s << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

Выход программы

azert qsdfg wxcvb poiuy mlkjh 
aqwpm zsxol edcik rfvuj tgbyh 

Что касается вашего кода, чем эти заявления

std::string table_h[SIZE]; 
std::string table_v[SIZE]; 

определенные два массивы пустых строк. Таким образом, вы не можете применять индекс opertaor к пустой строке. Вы можете использовать, например, функцию-член push_back

for (int j = 0; j< SIZE; j++) 
    { 
     table_v[j].push_back(table_h[i][j]); 
    } 
Смежные вопросы