Помещение std :: string в массив char [] [] - PullRequest
0 голосов
/ 11 февраля 2012

Итак, я пытаюсь создать интерпретатор Befunge и читать текстовый файл в массив.Я использую этот код:

char map[100][100]; //not 85 x 20
//load the source
ifstream f;
f.open("file.txt", ios::in);
string s;
int i = 0;
while(f.good() && i < 100)
{
    getline(f, s);
    map[i] = s.c_str();
    i++;
}

Это не работает, кто-нибудь знает способ сделать это без ручного цикла по строке?

Ответы [ 3 ]

3 голосов
/ 11 февраля 2012

Используйте strncpy() и укажите количество байтов:

strncpy(map[i], s.c_str(), 100);
map[i][99] = '\0'; /* this could trim s.c_str(), but at least you don't get an overflow */

вместо:

map[i] = s.c_str();

Указав количество байтов, скопированных как,самое большее, 100, вы гарантируете, что не переполняете map[i].Функция strncpy() будет дополнять map[i] терминаторами, если strlen(s.c_str()) < 100.В случае, когда strlen(s.c_str()) >= 100, строка будет обрезана, чтобы обеспечить map[i] необходимым нулевым терминатором.

0 голосов
/ 11 февраля 2012

Вопреки другим ответам, уже опубликованным здесь, вы НЕ должны пытаться использовать strcpy для копирования в «карту».Перед тем как начать копирование, вы должны убедиться, что буфер не переполнен.Для этого вам следует использовать не размер источника, а размер получателя.Причина этого заключается в том, что источник потенциально может быть длиннее, чем место назначения.Чтобы избежать проблемы, которая может не поднять голову, пока вы не сделаете другие интенсивные вычисления, вы должны убедиться, что вы не пытаетесь скопировать в место назначения, которое недостаточно велико, чтобы содержать то, что вы пытаетесь скопировать вit.

Это сигнатура функции для копирования строк (ну, та, которую вы должны использовать здесь):

strncpy(dest, source, size);

Вот что вы должны использовать вместо:

strncpy(map[i], s.c_str(), sizeof(map[i]));

Редактировать:

В качестве альтернативы вы можете использовать strncpy_s () (если вы в Windows!), Что позволяет указывать длину источника и назначения.

strncpy_s(dest, dest_size, source, source_size)
0 голосов
/ 11 февраля 2012

Я думаю, что это безопаснее

char* map[100];
....   

while(f.good() && i < 100)
{
    getline(f, s);
    map[i] = new char[s.length() + 1];
    strcpy (map[i], s.c_str());
    i++;
}
...