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

Самописная Extract strings

14.02.2012, 21:30. Показов 2215. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вызывает завершение работы программы следующий проблематичный для мну код.
C++
1
2
3
4
5
6
7
char *Cheb21::ExtractString(int pos1,int pos2,char buff[512])
{
char *returned;
for(int i=pos1;buff[i]!=0;i++)
{if(i!=pos2){returned+=buff[i];}else{return returned;}
}
}
Во время выполнения этого кода программа вылетает, подозреваю что из за
C++
1
returned+=buff[i];
пробывал и так...
C++
1
2
3
4
char returned[512];
for(int i=pos1,int y;buff[i]!=0;i++)
{if(i!=pos2){returned[y]+=buff[i];y++;}else{return returned;}
}
Получается аналогическая ошибка.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2012, 21:30
Ответы с готовыми решениями:

Самописная функция и класс
Есть код написанный процедурным стилем. Есть самописные функции. Теперь о самом страшном для...

Конвертация 7.7. Самописная в 8.2 ЖКХ
Добрый вечер столкнулся с таким интересным вопросом, как конвертация. Уже пробовал разными...

Самописная сериализация List<>
Пишу свой сериализатор. Дохожу до свойства List&lt;ClassName&gt;. Как мне узнать что это именно List&lt;&gt; ?...

Самописная SMPP библиотека
Есть спецификация по данному протоколу, а как использовать все эти bind_transmitter ,...

17
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
14.02.2012, 22:09 2
Цитата Сообщение от Gus Посмотреть сообщение
returned+=buff[i]
страшная весчь

Цитата Сообщение от Gus Посмотреть сообщение
returned[y]+=buff[i
у - не определено.

напиши че сделать то хочешь, тебе проще сделают небось.
0
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
15.02.2012, 09:41  [ТС] 3
C++
1
2
3
for(int i=pos1,int y;buff[i]!=0;i++)
{if(i!=pos2){returned[y]+=buff[i];y++;}else{return returned;}
}
y определен в цикле, что мне нужно можно понять из аргументов функций и его возвращаемого значения.
Мне нужно вырезать строку начинающуюся с pos1, заканчивая pos2 строки buff
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
15.02.2012, 10:49 4
C
1
2
3
4
5
6
7
8
9
static char r[512];
int Lbu = strlen(buf);
r[0] = 0;
if (pos1 > Lbu || pos2<=pos1) return(r);
int L = pos2 - pos1;
char *s = buf+pos1;
for(i=0; i<L && buf[pos1+i]!=0; i++) r[i] = buf[pos1+i];
r[i] = 0;
return r;
Как-то так. Не проверял, возможны описки
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,591
15.02.2012, 10:50 5
Так не выйдет. Даже не выделена память под returned, не говоря уже о чудовищной адресации.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
char *substring(const char *source, char *destination, size_t first, size_t last) {
  size_t i;
  for (i = first; source[i] != '\0' && i != last; ++i)
    destination[i - first] = source[i];
  destination[i - first] = '\0';
  return destination;
}
 
int main(int argc, char *argv[]) {
  char buffer[512];
  std::cout << "'" << substring("I love coding.", buffer, 2, 2 + 75) <<
    "'" << std::endl;
  std::cout << "'" << substring("I love coding.", buffer, 2, 2 + 4) <<
    "'" << std::endl;
}
0
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
15.02.2012, 22:35  [ТС] 6
Цитата Сообщение от lemegeton Посмотреть сообщение
Так не выйдет. Даже не выделена память под returned, не говоря уже о чудовищной адресации.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
char *substring(const char *source, char *destination, size_t first, size_t last) {
  size_t i;
  for (i = first; source[i] != '\0' && i != last; ++i)
    destination[i - first] = source[i];
  destination[i - first] = '\0';
  return destination;
}
 
int main(int argc, char *argv[]) {
  char buffer[512];
  std::cout << "'" << substring("I love coding.", buffer, 2, 2 + 75) <<
    "'" << std::endl;
  std::cout << "'" << substring("I love coding.", buffer, 2, 2 + 4) <<
    "'" << std::endl;
}
никаких изменений не произошло, при вводе строки, программа зависает
C++
1
2
3
4
5
6
char str[512];
int i;
int y;
cin>>str;
cin>>i;
cin>>y;
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,591
15.02.2012, 22:41 7
Мой код компилируется и работает?
Приведите свой код полностью.
0
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
16.02.2012, 00:06  [ТС] 8
Да, все коды компилируются нормально, но после ввода самой строки программа вылетает.
0
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
03.03.2012, 19:29  [ТС] 9
При вызове данной функции программа автоматически вылетает
C++
1
2
3
4
5
6
7
8
9
10
char ExtractString(int pos1,int pos2,char buff[512])
{
char returned[512];
for(int y=0,int i=pos1;i<sizeof(buff)&&buff[i]!=0;i++)
{
returned[y]=buff[i];
y++;
}
return returned;
}
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
03.03.2012, 20:33 10
конечно вылетает. возвращаете локальный объект.

Добавлено через 1 минуту
что вы хотите? вернуть новую строку, являющуюся подстрокой buff?
тогда либо выделяйте память, либо передавайте выходной буфер в ф-ю
0
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
03.03.2012, 20:57  [ТС] 11
разве я не выделил память под buff и returned ?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
03.03.2012, 21:10 12
память, "выделенная" под автоматическую переменную, "удаляется" при выходе из области видимости переменной.

Добавлено через 1 минуту
чтобы вернуть ее из ф-ии придется выделять динамическую память из кучи

Добавлено через 41 секунду
что-то в этом роде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// возвращает новую строку, являющуюся подстрокой
// [buf[pos1]; buf[pos2]). не забудьте потом удалить
// ее с помощью delete[].
char* ExtractString(int pos1,int pos2,char* buff)
{
    int sublen = pos2 - pos1;
    if(sublen <= 0)
        return 0;
    int len = strlen(&buff[pos1]);
    sublen = len < sublen ? len : sublen;
    char* ret = new char[sublen+1];
    strncpy(ret, &buff[pos1], sublen);
    ret[sublen] = '\0';
    return ret;
}
Добавлено через 1 минуту
но я бы рекомендовал переделать вашу ф-ю так, чтобы передавать выходной буфер в ф-ю
как-нибудь так
C++
1
2
3
4
5
6
7
8
// копирует n символов из str, начиная с элемента str[pos], в sub
// sub должна иметь достаточный размер (>n) 
char* ExtractString(char* sub, size_t pos, size_t n, const char* str)
{
    strncpy(sub, &str[pos], n);
    sub[n] = '\0';
    return sub;
}
1
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
08.03.2012, 13:09  [ТС] 13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdlib>
#include <iostream>
 
using namespace std;
char *ExtractSubStringChar(int pos1,int pos2,char buff[4096],char *returned)
{
      char buffer[500];
      if(pos2==0){for(int i=pos1;i<sizeof(buff);i++){strcat(returned,(const char*)buff[i]);}}
      if(pos2!=0){for(int i=pos1;i<pos2&&buff[i]!=0;i++){strcat(returned,(const char*)buff[i]);}}
      return returned;
}
int main(int argc, char *argv[])
{
    char temp[500];
    char returned[500];
    cin>>temp;
    cout<<ExtractSubStringChar(3,5,temp,returned)<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
И с выходным буффером ничего не получается, почему то...
0
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
08.03.2012, 13:47 14
Удаляет из исходной строки указанный диапазон, или как нужно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
#include <string> 
 
void ExtractString(std::string::size_type pos1, std::string::size_type pos2, std::string& str)
{
    std::string::iterator first = str.begin() + pos1;
    std::string::iterator last = str.begin() + pos2;
    str.erase(first, last);
}
 
 int main() 
 { 
     std::string str = "Hello world!";
     ExtractString(0, 3, str);
     std::cout << str << std::endl;
     system("pause"); 
 }
0
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
08.03.2012, 13:49  [ТС] 15
Не удаляет а извлекает. нужно извлечь из строки подстроки
0
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
08.03.2012, 14:02 16
То есть вернуть строку из указанного диапазона?
Так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream> 
#include <string> 
 
char* ExtractString(std::string::size_type pos1, std::string::size_type pos2, std::string str, char*& str_out)
{
    std::string::iterator first = str.begin() + pos1;
    std::string::iterator last = str.begin() + pos2;
    std::string res(first, last);
    str_out = new char [res.size() + 1];
    strcpy(str_out, res.c_str());
    str_out[res.size()] = '\0';
    return str_out;
}
 
 int main() 
 { 
     std::string str = "Hello world!";
     char* res_str(NULL);
     ExtractString(0, 3, str, res_str);
     cout << res_str << endl;
     system("pause"); 
 }
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.03.2012, 16:08 17
Whiteha, Что за изврат? string::substr не?
0
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
08.03.2012, 17:53  [ТС] 18
Спасибо всем, разобрался. Особая благодарность retmas'y.
0
08.03.2012, 17:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2012, 17:53
Помогаю со студенческими работами здесь

Extract из массива
Доброго времени! Есть массив из &lt;pre&gt; Array ( =&gt; Array ( =&gt; 0

Продам мини CRM (самописная)
Включает в себя: - Ведение базы о контрагентах и их контактах; - Запись и хранение информации о...

Самописная конфигурация. Преобразование переменной
Здравствуйте. У меня в конфиграции имеется документ СчетФактураПродажа. В нем табличная часть с...

Extract Recovery Pass
Не подскажите почему выскакивает сообщение &quot;You are not authorized to recovery thys ID file&quot;, когда...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru