Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2013, 04:54   #1
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию Функция неправильно возвращает строку(С++)

Функция Slovo(str,c) проверяет строку "str" на наличие слов начинающихся на символ 'c'. Затем выводить эти слова прямо в функции.
ниже приведенная программа выдает резултат: "capital".
Код:
char *slovo(char *str, char c);
int main()
{	slovo(" london is a capital of great britain",'c');
	//cout<<slovo(" london is a capital of great britain",'c');

getch();
return 0;
}
char *slovo(char *str,char c)
{char ss[20]="";
char ch[2];
	for(;*str;str++)
	{
		if ((*str==c)&&(*(str-1)==' '))
		while (((*str)!=' ')||(!(*str)))
		{	ch[0]=*str;
			ch[1]='\0';
			strcat(ss,ch);
			str++;
		}
	}
	cout<<ss;
	return ss;
}
ОДНАКО если выводить возвращаемое функцией значение:
Код:
char *slovo(char *str, char c);
int main()
{	//slovo(" london is a capital of great britain",'c');
	cout<<slovo(" london is a capital of great britain",'c');

getch();
return 0;
}
char *slovo(char *str,char c)
{char ss[20]="";
char ch[2];
	for(;*str;str++)
	{
		if ((*str==c)&&(*(str-1)==' '))
		while (((*str)!=' ')||(!(*str)))
		{	ch[0]=*str;
			ch[1]='\0';
			strcat(ss,ch);
			str++;
		}
	}
	//cout<<ss;
	return ss;
}
Результат работы первой и второй программы:
http://www.programmersforum.ru/attac...1&d=1360457645
Почему так?
Изображения
Тип файла: jpg результат.jpg (28.6 Кб, 28 просмотров)

Последний раз редактировалось tolikprankster; 10.02.2013 в 04:58.
tolikprankster вне форума Ответить с цитированием
Старый 10.02.2013, 10:14   #2
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Тут дело с временем жизни локального массива ss. Когда функция завершается, все локальные переменные удаляются. Вы же возвращаете указатель на действующий в функции указатель, но он уже указывает на мусор в функции main. Лучше передавайте в качестве аргумента указатель на другой массив, в который будет записываться результат
Hemul вне форума Ответить с цитированием
Старый 10.02.2013, 11:22   #3
tmtm
Пользователь
 
Регистрация: 12.05.2012
Сообщений: 20
По умолчанию

Код:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
char *slovo(char *str, char c);
int main()
{ cout<<slovo("c) london is a capital of great britain, companion",'c')<<endl;
  cout<<slovo("capital",'c')<<endl;
getch();
return 0;
}
char *slovo(char *str,char c)
{char* ss=new char[30];
 ss[0]='\0';
 char *s=&str[0];
 char *v=&ss[0];
       for(;*s;)
	{
	  if (*s==c)
          {if ((s==str) || (*(s-1)==' '))
	     {if (*ss) {ss[strlen(ss)]=' ';  v++;}
               { while ((*s!=' ') && (*s))
	         {*v=*s;
                  s++; v++; }
                *v='\0';
               }
             }
           }
          if (*s) s++;
       }
	return ss;
}
tmtm вне форума Ответить с цитированием
Старый 10.02.2013, 17:43   #4
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

всем спасибо исправил:
Код:
void slovo(char *str, char c,char *a);
int main()
{	char a[30]="";
	slovo("cs london is a capital of great britain",'c',a);
	//cout<<slovo(" london is a capital of great britain",'c');
	cout<<a;
getch();
return 0;
}
void slovo(char *str,char c,char *a)
{char ss[20]="";
char ch[2];
	for(;*str;str++)
	{
		if ((*str==c)&&(*(str-1)==' '))
		while (((*str)!=' ')||(!(*str)))
		{	ch[0]=*str;
			ch[1]='\0';
			strcat(a,ch);
			str++;
		}
	}
	cout<<ss;
}
tolikprankster вне форума Ответить с цитированием
Старый 10.02.2013, 20:08   #5
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Цитата:
Сообщение от tmtm Посмотреть сообщение
Код:
char* ss=new char[30];
Вы динамически выделяете память, но нигде ее не освобождаете. Нехорошо
Hemul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция возвращает массив C++ MayhemWithMercy Помощь студентам 1 31.10.2012 07:33
Функция возвращает пустую строку Chikoy Общие вопросы Delphi 6 18.05.2012 07:18
Функция не возвращает данные. Abuhamed JavaScript, Ajax 4 26.10.2011 10:33
Функция возвращает массив Рик Общие вопросы Delphi 5 22.03.2011 09:07
Функция не возвращает значения 2.0 Winlook PHP 1 10.05.2010 00:58