Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364

Преобразование типа char -> char *

15.12.2012, 21:02. Показов 2023. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, у меня возникла вот такая вот проблема...
При работе парсера, он разделяет строки как и задуманно, но появляются непредвиденные символы, невезь откуда.
Скорее всего подозрение падает на преобразование типа char -> char *
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
26
27
28
29
30
31
32
int s_pars::Position(char symb,char *buff,int b_size)
{
    for (int i=0;i<b_size;i++)
    {
        if(i<2&&buff[i]=='/')
        {return -2;} // Код коментариев.
        if(buff[i]==symb)
        {return i;}
    }
    return -1;
}
int s_pars::ExtractString(char *buff,char *r_buff,int b_size, int pos1,int pos2,  bool d_mode)
{
int y=0;
int i;
for (i=pos1;i<pos2&&i<b_size;i++)
{
    r_buff[y]=buff[i];
    y++;
}
if(d_mode) //смещаем данные
{
    for(int x=0;x<=pos2;x++)
    {
        if(pos2+x!=b_size)
        {
            buff[x]=buff[pos2+x];
        }
    }
}
return 0;
}
C++
1
2
3
4
5
6
7
gus21rus@NeuralComputer:~/Рабочий стол/Проекты/cheb21client/bin/Release$ ./cheb21client
Запуск приложения...
Thread started!
Начало конфигурации системы
Открытие конфигурационного файла: ОК
Чтение данных: Entering param LOADGUI|Uӿ�{e buff LOADGUI=true;
gus21rus@NeuralComputer:~/Рабочий стол/Проекты/cheb21client/bin/Release$
Использую сиауты что бы просмотреть что там находится, получаю вот данный вывод...
p.s Entering param LOADGUI|Uӿ�{e buff LOADGUI=true;

преобразование типа имеет следующий вид
C++
1
2
3
pars.ExtractString((char *)buff,&param[0],sizeof(buff),0,pos2,false);
раньше было
pars.ExtractString((char *)buff,(char *)param,sizeof(buff),0,pos2,false);
Данный парсер предназначен для конфигурирования системы принципом параметр=аргумент;

Добавлено через 3 часа 59 минут
эм, я может что то не так написал, если не получил еще ответа?)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2012, 21:02
Ответы с готовыми решениями:

Проблема с вызовом функции(аргумент типа const char* несовместим с параметром типа char*)
void cht(char* binary) { n = 0; double s = 0; fout &lt;&lt; &quot;Чтение файла: &quot; &lt;&lt; endl; fin.open(binary, ios::in | ios::binary); if...

Значение типа const char* нельзя использовать для инициализации сущности типа char*
#include &lt;iostream&gt; using namespace std; void color_scheme_func(char* color) { system(color); }

Аргумент типа (const char*) несовместим с параметром типа (char*). Как исправить?
#include &quot;Table.h&quot; #include &quot;Contour.h&quot; #include &quot;TwoShape.h&quot; #include &lt;iostream&gt; int main() { Contour circle; ...

15
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.12.2012, 21:18
Цитата Сообщение от Gus Посмотреть сообщение
i<b_size
А если попробовать i < b_size + 1

Добавлено через 1 минуту
Цитата Сообщение от go Посмотреть сообщение
А если попробовать i < b_size + 1
Нет, бред сказал. Прокомментируйте каждый параметр в вызываемой функции и и покажите их объявление.

Добавлено через 1 минуту
Gus, кароче мне кажется, что Вы теряете '\0'

Добавлено через 16 секунд
Цитата Сообщение от go Посмотреть сообщение
А если попробовать i < b_size + 1
И возможно это не бред.
0
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
15.12.2012, 21:25  [ТС]
пробывал! да проблема исчезает. последний символ стирается.

C++
1
2
3
4
5
6
7
8
if(strcmp(param,"LOADGUI")==0)
{
pars.ExtractString((char *)buff,(char *)arg,sizeof(buff),
                   pars.Position('=',(char *)buff,sizeof(buff)),
                   pars.Position(';',(char *)buff,sizeof(buff)),true);
                   cout <<"GUI CHECKED!"<<endl;
                   if(strcmp(arg,"true")==0){cout <<"OK"<<endl;}}
}
C++
1
pars.ExtractString((char *)buff,&param[0],sizeof(buff),0,pos2,false);
Два места откуда они вызываются.

Добавлено через 6 минут
так ваши слова не сразу понял коментирую.
ExtractString - 1 агрумент указатель входного буфера типа чара, где содержится строка
2 агрумент возвращаемый указатель.
3 Размер буффера (что бы не вылетел из массива)
4 начальная позиция (int)
5 конечная позиция (int)
6 сместить ли массив данных, на длину вырезанной строки(кол во символов) (bool)
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.12.2012, 21:30
Цитата Сообщение от Gus Посмотреть сообщение
пробывал! да проблема исчезает. последний символ стирается.
Так а что сейчас случилось?

Добавлено через 1 минуту
Gus, Си-строка нуль-терминированная. Вы должны сами доставить нуль-терминатор.
0
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
15.12.2012, 21:36  [ТС]
попробуем... тогда с \0

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int s_pars::ExtractString(char *buff,char *r_buff,int b_size, int pos1,int pos2,  bool d_mode)
{
int y=0;
int i;
for (i=pos1;i<pos2&&i<b_size;i++)
{
    r_buff[y]=buff[i];
    y++;
}
if(d_mode) //смещаем данные
{
    for(int x=0;x<=pos2;x++)
    {
        if(pos2+x!=b_size)
        {
            buff[x]=buff[pos2+x];
        }
    }
}
strcat(r_buff,'\0');
return 0;
}
Segmentation fault (core dumped)
хотя не правильно сделал, сейчас по другому попробую.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2012, 21:38
да, работа с голыми указателями - она такая. чревата крашами и глюками.
почему вы не пользуетесь скажем std::string? планируете парсить миллионы строк и это типа оптимизация?
0
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
15.12.2012, 21:40  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int s_pars::ExtractString(char *buff,char *r_buff,int b_size, int pos1,int pos2,  bool d_mode)
{
int y=0;
int i,x;
for (i=pos1;i<pos2&&i<b_size;i++)
{
    r_buff[y]=buff[i];
    y++;
}
r_buff[i+1]='\0';
if(d_mode) //смещаем данные
{
    for(x=0;x<=pos2;x++)
    {
        if(pos2+x!=b_size)
        {
            buff[x]=buff[pos2+x];
        }
    }
}
buff[pos2+(++x)]='\0';
return 0;
}
так тоже особо не помогло..

Добавлено через 51 секунду
согласен затея г..но, но как то привычнее работать с чаром. да и понятнее для мну будет немного. что я делаю и почему я это делаю)
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2012, 21:42
согласен затея г..но, но как то привычнее работать с чаром. да и понятнее для мну будет немного. что я делаю и почему я это делаю)
ну это вы зря. если утрировать эти слова, то можно казать что на ассемблере этот код будет понятнее.
стоит один раз освоить std::string и много много геморроя уйдет. к тому же осваивать там нечего,
все просто и понятно.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.12.2012, 21:46
Цитата Сообщение от Gus Посмотреть сообщение
strcat(r_buff,'\0');
А ничего, что strcat сначало будет искать этот самый '\0' ?
C++
1
2
3
4
5
6
7
for (i=pos1;i<pos2&&i<b_size;i++)
{
    r_buff[y]=buff[i];
    y++;
}
 
r_buff[y] = '\0';
0
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
15.12.2012, 21:48  [ТС]
я пользовался string AnsiString но в конечном счете мне более по нраву char.

Добавлено через 1 минуту
Цитата Сообщение от go Посмотреть сообщение
А ничего, что strcat сначало будет искать этот самый '\0' ?
C++
1
2
3
4
5
6
7
for (i=pos1;i<pos2&&i<b_size;i++)
{
    r_buff[y]=buff[i];
    y++;
}
 
r_buff[y] = '\0';
C++
1
r_buff[i+1]='\0';
в ручную добавил
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.12.2012, 22:09
Цитата Сообщение от Gus Посмотреть сообщение
в ручную добавил
Получили желаемый результат?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2012, 22:11
вот накидал по быстрому примерно то, чего вы хотите сделать:
http://liveworkspace.org/code/4piPYI$4
задача свелась к подзадачкам:
нужно как-то перечислять строки из файла. делается. просто.
нужно более навороченный парсер, скажем чтобы строки 'key = value' были корректными.
ну и остается просто правильно интерпретировать строки в получившейся мапине.

это для сравнения. больше половина кода - это тупо обработка ошибок. без обработки все вообще трехстрочное.
1
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
16.12.2012, 00:46  [ТС]
но к сожалению проблема не ушла.

Добавлено через 2 часа 27 минут
зачем так жить если возникает ошибка Core dumped?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.12.2012, 00:55
это типа ап такой чтоли?
вы сказали голые указатели вам понятнее и проще. вот радуйтесь. вроде все просто, но ошибится в индексах, залезть не в ту память и получить краш - это как здрасти.
более высокоуровневые классы придумали не от хорошей жизни. пользуйтесь ими.
и второй совет: освойте отладчик той среды, в которой работаете. подобного рода краши с отладчиком находятся и исправляются без особых проблем.
1
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
16.12.2012, 13:20  [ТС]
Кхмм. странно... в Debug режиме программа не выдает этой ошибки.
в режиме Release ошибка появляется.
Используется стандартный отладчик GDB
0
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
20.12.2012, 19:20  [ТС]
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
26
27
28
29
30
int s_pars::Position(char symb,char *buff)
{
//Функция поиска индекса позиции символа в строке.
for(int i=0;buff[i]!='\0'||buff[i]!='\n';i++) //перелистываем массив в поиске нашего символа. условие поиска. пока buff не будет ровняться символу завершения строки.
    if(buff[i]==symb) //Сравнивание каждого элемента массива, с символом поиска.
    {
    return i;   //если найден возвращаем его индекс.
    }
    return -1; //Если нет, то возвращаем -1 (сообщение того что символ не найден)
}
 
int s_pars::ExtractString(char *buff,char *r_buff,int pos1,int pos2,  bool d_mode)
{
//Функция изьятия подстроки из строки.
int y,i;
for(i=pos1;i!=pos2&&buff[i]!='\0';i++) //Перебираем массив, и вырезаем подстроку.
{
    r_buff[i-pos1]=buff[i]; //Вырезаем строчку
}
if(d_mode==true) //смещаем буффер
{
    for(i=pos2;buff[i]!='\n';i++,y++)
    {
    buff[y]=buff[i];
    buff[i]=0;
    }
    buff[i+1]='\0'; //Добавляем терминирующий знак
}
r_buff[pos2+1]='\0'; //добавляем терминирующий знак
}
Вот тут немного проработал, никаких вылетов из за предела замечено не было. но... непонятные символы добавляются до сих пор... про недочеты данного алгоритма я знаю, что если попадется строка немного длиньше, в которой нет терминирующего знака \0 выдаст, ошибку, это я поправлю.
как быть с данной проблемой по существу (появление загадочных символов)

Добавлено через 3 часа 34 минуты
up!!!

Добавлено через 1 час 11 минут
народ, эта проблема тормозит процесс разработки... помогите.

Добавлено через 44 минуты
Решил вроде бы, как проблему но не так как задумал...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.12.2012, 19:20
Помогаю со студенческими работами здесь

Как полю класса типа char* присвоить значение типа *char
Проблема в строчке 46 (не пинайте сильно за формат кода и за говнокод) #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Аргумент типа const char* несовместим с параметром типа char* в классе
Данную ошибку находит в 74 - 76 строках, не могу понять что не так. #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std;...

Условие типа if( масив типа char[x] [y] != переменная типа char) не срабатывает
Создал функцию ChangeWay(). Все, кроме if(map !=ar) (обе переменные типа char) работает нормально, а когда выполнение доходит до этого...

Аргумент типа char (*)[1000] несовместим с параметром типа char**
Здравствуйте! Есть вот такая структура: #define max 1000 struct expr { char s; int index; };

Добавление в массив типа char * одного элемента типа char
Дан класс Строка, содержащий указатель на char - адрес динамически выделенной для размещения символов строки памяти и длину строки. Нужен...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru