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

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

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

GCC/Clang bug - C++

28.02.2013, 23:40. Просмотров 652. Ответов 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 минут
Ребята, откомпилируйте, пожалуйста, второй код в студии и скажите результат. Я не пойму в коде дело или с компилятором траблы...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2013, 23:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос GCC/Clang bug (C++):

Компиляция с Clang/LLVM - C++
Хотелось бы узнать можно ли в Windows использовать Clang/LLVM, без всяких визуал студий, GCC, Mingw, и.т.д? Добавлено через 2 часа 4...

Vim and Clang Complete - C++
Цикл вопросов про Vim продолжается... Итак, я скачал clangcomplete.vmb, запустил через терминал с нужными параметрами, он все...

Как подключить clang в Codeblocks для Windows? - C++
как подключить clang в codeblocks для windows? можно ли вообще это сделать? если да распишите пожалуйста подробнее как, все предыдущие...

Захват const переменной из лямбды: разный результат в g++ и clang - C++
Добрый день. #include &lt;iostream&gt; template &lt;class T&gt; void foo(const T&amp; t) { const int a = t; { ...

Ошибка при установке компилятора clang(LLVM) windows 10 - C++
Стоял 3.7 LLVM, работал. Установил 3.8(3.7 удалился при установке) и я схватил сию ошибку, что во вложении. Пытался опять поставить 3.7 -...

Проблемы с линковкой к библиотекам при установке LLVM Clang (не находит заголовочные файлы) - C++
Скачал и установил пакет LLVM-3.7.0 на Windows 7. Но при попытке скомпилировать файл 01.cpp с помощью команды clang++.exe 01.cpp, получил...

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

Gcc и c++ - C++
Доброго времени суток. Начну с предисловия. Я всегда писал на C++ под винду и в линукс не совался. Сейчас, я выполняю задание(тестовое) и...

gcc в c++ VS - C++
void MakeStrRef(RCString* sref,char* data){ asm(&quot;pushl %%eax\n&quot; &quot;call %%edx&quot; : ...

GotoXY в GCC - C++
ДОБРОГО ВРЕМЕНИ СУТОК !!! Я использую GCC и мне нужно использовать функцию GotoXY. В GCC нет библиотеки conio.h. Прошу дать код...

g++/gcc не компилирует - C++
есть С++ код #include &lt;iostream&gt; int main(){ std::cout &lt;&lt; &quot;hello ,world!&quot;; } запускаю компилятор и он ничего не...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
01.03.2013, 00:19
Ответ Создать тему
Опции темы

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