Форум: Форум C++Разное
Новые темы: 00
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите
 
 автор: Кэтрин   (06.10.2010 в 19:10)   письмо автору
 
 

мне нужно функцию job переписать с помощью указателей, я попыталась это сделать, но в указателях она не работает((( Задача состоит в том, что нужно сжать каждую строку, удалив из нее все символы, совпадающие с первым отличным от пробела символом исходной строки, а также лишние пробелы и символы табуляции.Полученную строку вывести на экран!
вот работающая программа --->
# include <iostream>
# include <string.h>

using namespace std;

const char* found (const char* p)
{
while (*p==' ' || *p=='\t')
++p;
return p;
}

char* job (const char *src, char *rez)
{
if (char k = (found(src))[0])
{
int l = 0;
int fl = 0;
for (int i = 0; i < strlen(src); ++i)
{
if (src[i]!= k && src[i] != ' ' && src[i]!= '\t' && src[i] != '\0')
{
rez[l] = src[i];
l += 1;
}

if (src[i] != ' ')
fl =0;

if (src[i] == ' ')
{
if (fl == 0)
{
rez[l] = src[i];
l += 1;
}
fl++;
}
rez[l] = '\0';
}
return rez;
}

else
*rez = '\0';
}

int main ()
{
char str1[80], str2[80];
while (cout << "Enter: \n", cin.getline(str1,80))
{
cout << "Sourl string: \n" << '"' << str1 << '"' << endl;
cout << "Result string: \n" << '"' << job (str1, str2) << '"' << endl;
}
return 0;

но переписав функцию job с помощью указателей, программа оказывается не работающей( помогите понять в чем проблема?
переписанная программа --->
# include <iostream>
# include <string.h>

using namespace std;

const char* found (const char* p)
{
while (*p==' ' || *p=='\t')
++p;
return p;
}


char* job (const char *src, char *rez)
{
if (char k = (found(src))[0])
{
int fl = 0;
while (*(src = found (src)))
{
if (*src != k && *src != ' ' && *src != '\t' && *src != '\0')
{
*rez = *src;
*rez++;
}

if (*src != ' ')
fl =0;

if (*src == ' ')
{
if (fl == 0)
{
*rez = *src;
*rez++;
}
fl++;
}
*rez = '\0';
}
return rez;
}

else
*rez = '\0';
}

int main ()
{
char str1[80], str2[80];
while (cout << "Enter: \n", cin.getline(str1,80))
{
cout << "Sourl string: \n" << str1 << endl;
cout << "Result string: \n" << job (str1, str2) << endl;
}
return 0;
}

  Ответить  
 
 автор: .....   (07.10.2010 в 19:56)
 
   для: Кэтрин   (06.10.2010 в 19:10)
 

>вот работающая программа
что-то мне показалось она не работает в точности по описанию. как например такое:

(но мне лично goto намногго удобнее в таких делах (хоть и бесит многих :)), конкретно здесь можно их и заменить, но я у себя не заменяю)
# include <iostream>
using namespace std;

char* job (const char *src, char *rez)
{
char f='\0'// запоминает первый пробел и \0 до нахождения
char* out = rez; // не изменяющийся указатель

x_srart:
while(*src && *src != ' ' && *src != '\t') {
if (!f) { src++; goto x_srart; }
*rez = *src;
rez++;
src++;
}
f=*src;
while(f && (*src == ' ' || *src == '\t')) src++;
*(rez++)=f;
if (f) goto x_srart;
return out;
}

int main () // не менял 
{
char str1[80], str2[80];
while (cout << "Enter: \n", cin.getline(str1,80))
{
cout << "Sourl string: \n" << '"' << str1 << '"' << endl;
cout << "Result string: \n" << '"' << job (str1, str2) << '"' << endl;
}
return 0;
}
должно быть можно сделать ещё оптимальнее.

  Ответить  
 
 автор: ........   (07.10.2010 в 19:59)
 
   для: .....   (07.10.2010 в 19:56)
 

форум порезал все табы-отступы

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования