Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
#1

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

15.08.2012, 17:18. Просмотров 591. Ответов 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++):

Массив строк преобразовать в строку - C++
как преобразовать массив строк в строку через разделитель, то есть дано: "строка1" "строка2" "строка3" а нужно получить "строка1,...

Как поместить в массив строк строку - C++
Есть такой вот массив char s; ну или char** s; я никак не могу разобраться в этих указателях(( 1.Как поместить в него строку 2.Как...

Как поместить строку в двумерный массив строк - C++
как поместить строку в двумерный массив строк (статичный)? то есть, например, в каждую строку хочу писать только одно слово

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

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

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

13
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
15.08.2012, 17:19 #2
BuGi, А память для Arr кто выделять будет? strcpy ожидает буфер с уже выделенной памятью.
0
cossack5
54 / 48 / 1
Регистрация: 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 / 1
Регистрация: 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 / 1
Регистрация: 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 / 1
Регистрация: 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 / 1
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 19:17 #7
Где у вас код, который выводит?
0
BuGi
24 / 24 / 1
Регистрация: 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 / 1
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 20:18 #9
а вам что нужно? функция strtok записывает в tempstr строку до первого пробела! -
strtok(строка-буффер,символы до которых считываем)
0
BuGi
24 / 24 / 1
Регистрация: 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 / 1
Регистрация: 02.08.2012
Сообщений: 127
15.08.2012, 21:07 #11
Т.е. у вас не работает цикл? я правильно понимаю?
0
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
15.08.2012, 21:08  [ТС] #12
Ну видимо да
0
cossack5
54 / 48 / 1
Регистрация: 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 / 1
Регистрация: 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
Привет! Вот еще темы с ответами:

Сформировать массив строк. Удалить из него строку начинающуюся на букву «а» - C++
Сформировать массив строк. Удалить из него строку начинающуюся на букву «а». Пожалуйста помогите решить, заранее спасибо.

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

Сформировать динамический массив строк; удалить из него строку с заданным номером - C++
Сформировать динамический массив строк. Удалить из него строку с заданным номером. Добавлено через 1 час 15 минут UP!!!

Указатели. Сформировать массив строк. Удалить из него самую длинную строку - C++
Сформировать массив строк. Удалить из него самую длинную строку Добавлено через 16 часов 19 минут Что никто не знает как??


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

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

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