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

GCC/Clang bug - C++

Восстановить пароль Регистрация
 
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.02.2013, 23:40     GCC/Clang bug #1
Пытаюсь разбить строку на токены при помощи массива указателей и 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 минут
Ребята, откомпилируйте, пожалуйста, второй код в студии и скажите результат. Я не пойму в коде дело или с компилятором траблы...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2013, 23:40     GCC/Clang bug
Посмотрите здесь:

Компиляция (gcc) C++
C++ gcc update
C++ Vim and Clang Complete
C++ Захват const переменной из лямбды: разный результат в g++ и clang
C++ gcc в c++ VS
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1920 / 1186 / 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
Еще ссылки по теме:

gcc компиляция C++
Пытаемся подружить clang 3.6 и Code::Blocks 13.12 + MinGW под Windows 7 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
Ответ Создать тему
Опции темы

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