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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
#1

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

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

Вызывает завершение работы программы следующий проблематичный для мну код.
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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2012, 21:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Самописная Extract strings (C++):

Strings - C++
По воле случая я со строками не дружу, и с ними вообще не сталкиваюсь. Меня попросили выполнить задание, и я хочу переадресовать его вам,...

Строки (strings) в C++ - C++
Здравствуйте, уважаемые программисты! Прошу помочь нубу-новичку разобраться с некоторыми нюансами программирования на C++. Сишку учу с...

Соединение Strings - C++
Как обьеденить 2 строки char* в одну чтобы в последущем использовать в system(string) что то типа char* A, ip; ip="192.168.0.1" ...

How to do this? Array of strings - C++
1.George Washington (1789-1797) 2.John Adams (1797-1801) 3.Thomas Jefferson (1801-1809) 4.James Madison (1809-1817) 5.James Monroe...

BST of strings - C++
Задание реализовать для binary search tree string-ов функции add, find, print. struct tree{ string key; node * left; node *...

STL set of sets of strings - C++
Вот такая колбаса(I use VS10): std::set<std::set<std::string>> s; Возможно ли добавить во внутренний std::set<std::string>...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
14.02.2012, 22:09 #2
Цитата Сообщение от Gus Посмотреть сообщение
returned+=buff[i]
страшная весчь

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

напиши че сделать то хочешь, тебе проще сделают небось.
0
Gus
24 / 35 / 2
Регистрация: 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
16061 / 10330 / 1540
Регистрация: 24.12.2010
Сообщений: 19,458
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
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
Gus
24 / 35 / 2
Регистрация: 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
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
15.02.2012, 22:41 #7
Мой код компилируется и работает?
Приведите свой код полностью.
0
Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
16.02.2012, 00:06  [ТС] #8
Да, все коды компилируются нормально, но после ввода самой строки программа вылетает.
0
Gus
24 / 35 / 2
Регистрация: 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
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
03.03.2012, 20:33 #10
конечно вылетает. возвращаете локальный объект.

Добавлено через 1 минуту
что вы хотите? вернуть новую строку, являющуюся подстрокой buff?
тогда либо выделяйте память, либо передавайте выходной буфер в ф-ю
0
Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
03.03.2012, 20:57  [ТС] #11
разве я не выделил память под buff и returned ?
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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
Gus
24 / 35 / 2
Регистрация: 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
Whiteha
Программист
33 / 33 / 4
Регистрация: 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
Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
08.03.2012, 13:49  [ТС] #15
Не удаляет а извлекает. нужно извлечь из строки подстроки
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2012, 13:49
Привет! Вот еще темы с ответами:

Парочка примитивных неясностей о массивах и C-strings - C++
Когда я пишу: char * arr = new char; Выделяется память размером 7 байт под массив с элементами arr ... arr и обращение к arr приведет к...

Create an array of strings, find and delete duplicate lines and sort rows in the aray - C++
Write a program, the following operations: a) Create an array of strings. b) Find and delete duplicate lines. с) Sort rows in the...

Передача в функцию char*([Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]) - C++
Почему компилятор на это матерится? ObjA.Show(&quot;A&quot;); deprecated conversion from string constant to 'char*' #include &lt;iostream&gt; ...

Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC - C++
Программа толком не написан, проверял ранд и возникли проблемы. Ф-ция ранд генерирует одно и тоже число, но если убрать srand(time(0));,...


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

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

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