Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
BuGi
24 / 24 / 11
Регистрация: 02.01.2012
Сообщений: 371
#1

Строку в массив строк - C++

15.08.2012, 17:18. Просмотров 637. Ответов 13
Метки нет (Все метки)

Здравствуйте, написал функцию, которая записывает слово, как отдельный элемент массива, но я получаю ошибку
Debug Assertion Failed
Invalid Null Pointer

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct CommandArray
{
    char** Arr;
    USHORT Num;
};
 
CommandArray Text::StrToArray(LPSTR Str)
{
    CommandArray Out;
    LPSTR TempStr;
    Out.Num = 0;
    TempStr = strtok (Str," ");
    while(TempStr != NULL)
    {
        strcpy(Out.Arr[Out.Num],TempStr);
        Out.Num++;
        TempStr = strtok(NULL," ");
    }
    return Out;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2012, 17:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Строку в массив строк (C++):

Массив строк преобразовать в строку
как преобразовать массив строк в строку через разделитель, то есть дано:...

Как поместить в массив строк строку
Есть такой вот массив char s; ну или char** s; я никак не могу разобраться в...

Как поместить строку в двумерный массив строк
как поместить строку в двумерный массив строк (статичный)? то есть, например,...

Динамический массив строк (вставить строку с номером к)
Написал программу,задача была сформировать динамический массив и вставить...

Массив строк и найти в нем максимальную по длине строку
Ввести массив строк и найти в нем максимальную по длине строку. Не учитывать...

Сформировать массив строк. Удалить из него самую короткую строку
Помогите пожалуйста. Сформировать массив строк. Удалить из него самую короткую...

13
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
15.08.2012, 17:19 #2
BuGi, А память для Arr кто выделять будет? strcpy ожидает буфер с уже выделенной памятью.
0
cossack5
54 / 48 / 4
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 17:31 #3
Цитата Сообщение от BuGi Посмотреть сообщение
C++
1
strcpy(Out.Arr[Out.Num],TempStr);
Arr не выделен, и не инициализирован.
Нужно хотя бы так:
C++
1
2
3
4
5
6
7
Out.Arr=new char*[100]; // на сто элементов
 while(TempStr != NULL)
    {
      Out.Arr[Out.Num]=new char[strlen(TempStr)+1];
        strcpy(Out.Arr[Out.Num],TempStr);
   Out.Num++;
...
Но лучше использовать vector
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <vector>
using namespace std;
struct CommandArray
{
    vector<char*> Arr;
    USHORT Num;
};
 
CommandArray Text::StrToArray(LPSTR Str)
{
    CommandArray Out;
    LPSTR TempStr;
    TempStr = strtok (Str," ");
    while(TempStr != NULL)
    {
      Out.push_back(TempStr);
        TempStr = strtok(NULL," ");
    }
    return Out;
}
Вроде должно работать.
0
BuGi
24 / 24 / 11
Регистрация: 02.01.2012
Сообщений: 371
15.08.2012, 18:15  [ТС] #4
Во всех случаях вылетает та же ошибка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CommandArray Text::StrToArray(LPSTR Str)
{
    CommandArray Out;
    Out.Arr = new char*[128];
    LPSTR TempStr;
    Out.Num = 0;
    TempStr = strtok (Str," ");
    while(TempStr != NULL)
    {
        Out.Arr[Out.Num] = new char[strlen(TempStr)+1];
        strcpy(Out.Arr[Out.Num],TempStr);
        Out.Num++;
        TempStr = strtok(NULL," ");
    }
    return Out;
}
структуру оставил такой же

Добавлено через 6 минут
Хотя нет, это из-за другого. Но сейчас почему-то Out.Num == 1 всегда
0
cossack5
54 / 48 / 4
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 18:20 #5
а так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <vector>
using namespace std;
struct CommandArray
{
    vector<char*> Arr;
    USHORT Num;
};
 
CommandArray Text::StrToArray(LPSTR Str)
{
    CommandArray Out;
    LPSTR TempStr;
    TempStr = strtok (Str," ");
    while(TempStr != NULL)
    {
      Out.Arr.push_back(TempStr);
        TempStr = strtok(NULL," ");
    }
    return Out;
}
0
BuGi
24 / 24 / 11
Регистрация: 02.01.2012
Сообщений: 371
15.08.2012, 18:45  [ТС] #6
1, даже если ничего не вводить (т.е. поставить \0)

Добавлено через 16 минут
C++
1
2
3
4
5
6
7
8
9
while(TempStr != NULL)
    {
        //Out.Arr[Out.Num] = new char[strlen(TempStr)+1];
        //strcpy(Out.Arr[Out.Num],TempStr);
        cout << TempStr << "\n";
        Out.Arr.push_back(TempStr);
        Out.Num++;
        TempStr = strtok(NULL," ");
    }
Выводит только то, что до первого пробела, но почему? http://www.cplusplus.com/reference/clibrary/cstring/strtok/ по этому принципу написано, должно работать
0
cossack5
54 / 48 / 4
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 19:17 #7
Где у вас код, который выводит?
0
BuGi
24 / 24 / 11
Регистрация: 02.01.2012
Сообщений: 371
15.08.2012, 20:00  [ТС] #8
C++
1
2
3
4
5
6
7
8
9
while(TempStr != NULL)
    {
        //Out.Arr[Out.Num] = new char[strlen(TempStr)+1];
        //strcpy(Out.Arr[Out.Num],TempStr);
        cout << TempStr << "\n";
        Out.Arr.push_back(TempStr);
        Out.Num++;
        TempStr = strtok(NULL," ");
    }
0
cossack5
54 / 48 / 4
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 20:18 #9
а вам что нужно? функция strtok записывает в tempstr строку до первого пробела! -
strtok(строка-буффер,символы до которых считываем)
0
BuGi
24 / 24 / 11
Регистрация: 02.01.2012
Сообщений: 371
15.08.2012, 20:24  [ТС] #10
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
Splitting string "- This, a sample string." into tokens:
This
a
sample
string
0
cossack5
54 / 48 / 4
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 21:07 #11
Т.е. у вас не работает цикл? я правильно понимаю?
0
BuGi
24 / 24 / 11
Регистрация: 02.01.2012
Сообщений: 371
15.08.2012, 21:08  [ТС] #12
Ну видимо да
0
cossack5
54 / 48 / 4
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 21:31 #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
#include <vector>
struct CommandArray
{
    vector<string> Arr;
    USHORT Num;
};
 
CommandArray Text::StrToArray(LPSTR Str)
{
    CommandArray Out;
    LPSTR TempStr;
    Out.Num = 0;
    TempStr = strtok (Str," ");
    while(TempStr != NULL)
    {
       Arr.push_back(TempStr);
        Out.Num++;
        TempStr = strtok(NULL," ");
    }
    return Out;
}
Вот так должно работать.
0
BuGi
24 / 24 / 11
Регистрация: 02.01.2012
Сообщений: 371
15.08.2012, 21:37  [ТС] #14
Не, надо с чаром
0
15.08.2012, 21:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2012, 21:37
Привет! Вот еще темы с решениями:

Объявлен массив строк. Как вывести на экран третью строку?
char lines; char *pl = lines; a. cout &lt;&lt; pl+3; b. cout &lt;&lt; *(pl+3); ...

Сформировать массив строк. Удалить из него строку начинающуюся на букву «а»
Сформировать массив строк. Удалить из него строку начинающуюся на букву «а»....

Указатели. Сформировать массив строк. Удалить из него самую длинную строку
Сформировать массив строк. Удалить из него самую длинную строку Добавлено...

Сформировать динамический массив строк; удалить из него строку с заданным номером
Сформировать динамический массив строк. Удалить из него строку с заданным...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru