Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

GCC/Clang bug - C++

28.02.2013, 23:40. Просмотров 603. Ответов 6
Метки нет (Все метки)

Пытаюсь разбить строку на токены при помощи массива указателей и strtok. Вот рабочий и неправильный вариант, так как присутствует повторное выделение памяти для одного и того-же указателя:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <cstring>
 
char str[] = "Hello,dow,base,ddddw,face,place,drow.";
int count;
 
int main()
{
    char* ptr = strtok(str, ",.");
    char** clt = new char*[strlen(str)];
    clt[count] = new char[strlen(ptr)+1]; // выделяем память в первый раз
 
    while (ptr)
    {
        clt[count] = new char[strlen(ptr)+1]; // повторное выделение памяти
        strcpy(clt[count], ptr);
        ++count;
 
        ptr = strtok('\0', ",.");
    }
 
    for (int i = 0; i < count; ++i)
        std::cout << clt[i] << '\n';
 
}
результат:
Bash
1
2
3
4
5
6
7
8
9
ilyuha21st@coldshoot:~/projects$ ./prog
Hello
dow
base
ddddw
face
place
drow
ilyuha21st@coldshoot:~/projects$
А вот вариант, как мне кажется верный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <cstring>
 
char str[] = "Hello,dow,base,ddddw,face,place,drow.";
int count;
 
int main()
{
    char* ptr = strtok(str, ",.");
    char** clt = new char*[strlen(str)];
   
    while (ptr)
    {
        clt[count] = new char[strlen(ptr)+1]; // выделяем память для токена один раз
        strcpy(clt[count], ptr);
        ++count;
 
        ptr = strtok('\0', ",.");
    }
 
    for (int i = 0; i < count; ++i)
        std::cout << clt[i] << '\n';
 
}
результат:
Bash
1
2
3
4
5
6
7
8
9
10
ilyuha21st@coldshoot:~/projects$ g++ main.cpp -o prog -Wall -pedantic -W
ilyuha21st@coldshoot:~/projects$ ./prog
пїЅ ?   o
dow
base
ddddw
face
place
drow
ilyuha21st@coldshoot:~/projects$
первый токен - просто мусор. В чём ошибка не пойму.

Добавлено через 4 часа 5 минут
Ребята, кто может пользоваться отладчиком (или просто кто в курсе) покажите в чём загвостка.

Добавлено через 1 час 37 минут
Ребята, откомпилируйте, пожалуйста, второй код в студии и скажите результат. Я не пойму в коде дело или с компилятором траблы...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
28.02.2013, 23:53     GCC/Clang bug #2
под виндой на gcc нормальный вывод, а тут практически как у вас.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
01.03.2013, 00:05  [ТС]     GCC/Clang bug #3
Значит всётаки баг под линухом...
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
01.03.2013, 00:08     GCC/Clang bug #4
C++
1
2
    char* ptr = strtok(str, ",.");
    char** clt = new char*[strlen(str)];
strtok вставляет \0 после hello, затем вы выделяете память под 5 указателей на char (strlen(str) тут будет 5).
Поменяйте строки местами)
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.03.2013, 00:09     GCC/Clang bug #5
C++
1
2
3
    char* ptr = strtok(str, ",."); //изменяем str, добивая нуль после "Hello"
    char** clt = new char*[strlen(str)]; //считаем длину измененной строки. 
    //очевидно, этой длины не хватает
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
01.03.2013, 00:10     GCC/Clang bug #6
Только тогда память выделится под 37 строк ) многовато...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2013, 00:19     GCC/Clang bug
Еще ссылки по теме:

Ошибка при установке компилятора clang(LLVM) windows 10 C++
Компиляция с Clang/LLVM C++
C++ Как подключить clang в Codeblocks для Windows?
C++ Gcc и c++

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

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
01.03.2013, 00:19  [ТС]     GCC/Clang bug #7
Цитата Сообщение от diagon Посмотреть сообщение
//очевидно, этой длины не хватает
Как же верно подмечено, а... Тупанул я не много, (а может быть и много);
Нужно просто пеменять, эти строки местами. Я почему-то упустил из виду, что strtok модифицирует строку... Спасибо большое...
Yandex
Объявления
01.03.2013, 00:19     GCC/Clang bug
Ответ Создать тему
Опции темы

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