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

Самописная Extract strings - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Gus
 Аватар для Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
14.02.2012, 21:30     Самописная Extract strings #1
Вызывает завершение работы программы следующий проблематичный для мну код.
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;}
}
Получается аналогическая ошибка.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2012, 21:30     Самописная Extract strings
Посмотрите здесь:

C++ Strings
Соединение Strings C++
как пользоваться самописная функциями? C++
BST of strings C++
C++ Парочка примитивных неясностей о массивах и C-strings
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
14.02.2012, 22:09     Самописная Extract strings #2
Цитата Сообщение от Gus Посмотреть сообщение
returned+=buff[i]
страшная весчь

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

напиши че сделать то хочешь, тебе проще сделают небось.
Gus
 Аватар для Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
15.02.2012, 09:41  [ТС]     Самописная Extract strings #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
Байт
 Аватар для Байт
13993 / 8824 / 1231
Регистрация: 24.12.2010
Сообщений: 15,990
15.02.2012, 10:49     Самописная Extract strings #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;
Как-то так. Не проверял, возможны описки
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.02.2012, 10:50     Самописная Extract strings #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;
}
Gus
 Аватар для Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
15.02.2012, 22:35  [ТС]     Самописная Extract strings #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;
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.02.2012, 22:41     Самописная Extract strings #7
Мой код компилируется и работает?
Приведите свой код полностью.
Gus
 Аватар для Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
16.02.2012, 00:06  [ТС]     Самописная Extract strings #8
Да, все коды компилируются нормально, но после ввода самой строки программа вылетает.
Gus
 Аватар для Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
03.03.2012, 19:29  [ТС]     Самописная Extract strings #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;
}
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
03.03.2012, 20:33     Самописная Extract strings #10
конечно вылетает. возвращаете локальный объект.

Добавлено через 1 минуту
что вы хотите? вернуть новую строку, являющуюся подстрокой buff?
тогда либо выделяйте память, либо передавайте выходной буфер в ф-ю
Gus
 Аватар для Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
03.03.2012, 20:57  [ТС]     Самописная Extract strings #11
разве я не выделил память под buff и returned ?
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
03.03.2012, 21:10     Самописная Extract strings #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;
}
Gus
 Аватар для Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
08.03.2012, 13:09  [ТС]     Самописная Extract strings #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;
}
И с выходным буффером ничего не получается, почему то...
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
08.03.2012, 13:47     Самописная Extract strings #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"); 
 }
Gus
 Аватар для Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
08.03.2012, 13:49  [ТС]     Самописная Extract strings #15
Не удаляет а извлекает. нужно извлечь из строки подстроки
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
08.03.2012, 14:02     Самописная Extract strings #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"); 
 }
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.03.2012, 16:08     Самописная Extract strings #17
Whiteha, Что за изврат? string::substr не?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2012, 17:53     Самописная Extract strings
Еще ссылки по теме:

C++ How to do this? Array of strings
C++ Create an array of strings, find and delete duplicate lines and sort rows in the aray
C++ Строки (strings) в C++

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

Или воспользуйтесь поиском по форуму:
Gus
 Аватар для Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
08.03.2012, 17:53  [ТС]     Самописная Extract strings #18
Спасибо всем, разобрался. Особая благодарность retmas'y.
Yandex
Объявления
08.03.2012, 17:53     Самописная Extract strings
Ответ Создать тему
Опции темы

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