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

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

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

GCC/Clang bug - C++

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
28.02.2013, 23:53     GCC/Clang bug #2
под виндой на gcc нормальный вывод, а тут практически как у вас.
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
01.03.2013, 00:05  [ТС]     GCC/Clang bug #3
Значит всётаки баг под линухом...
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
1928 / 1194 / 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
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++
Подскажите как в VS скомпилировать программу с помощью компилятора gcc

gcc VS DEV-C++ 4.9.9.2 - C++
Люди!! Срочно нужны знающие люди по данному вопросу.Только сейчас узнал,что вся практика будет в gcc...... Какие отличия вообще между ними...

gcc update - C++
как обновить gcc? Нужно качать новую версию и заново устанавливать или есть какая-то команда, чтобы сделать это?

gcc компиляция - C++
Проблема возникла при компиляции проекта code::block. При build and run все работает, в папке bin проекта появляется .exe Но...


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

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
303 / 274 / 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
Ответ Создать тему
Опции темы

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