|
|
|
| мне нужно функцию 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)
| | форум порезал все табы-отступы | |
|
|
|