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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 64, средняя оценка - 4.75
Zion3439
2 / 2 / 0
Регистрация: 04.03.2009
Сообщений: 30
#1

Удаление лишних пробелов в начале и конце строки. - C++

04.03.2009, 13:31. Просмотров 8200. Ответов 28
Метки нет (Все метки)

Нужно написать функцию char*alltrim(char*string) для удаления пробелов в начале и конце строки с помощью указателей. Помогите завершить задачку.
Возник ряд вопросов:
1) как создать какую-то произвольную переменную типа char ( у меня это p)и записать туда из строки string подстроку начиная с определённого элемента заканчивая другим элементом с помощью указателей? Надо ли в конце этой строки p записать NULL?
2)Как потом эту произвольную переменную ( у меня это p) вернуть как результат работы функции заместо переменной string?
3) Как вобще правильно описать переменную размер которой неизвестен?
Вот чего получилось добится:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream.h>
char*alltrim(char*string)
 {
  int i=0,d=0,c=0,g=0;
  while(*string==' ')  // Считается количество пробелов в начале строки - i
  {
   c=c+1;
   i=i+1;
   *string++;
  }
  while(*string) // Считается количество пробелов в конце строки - d
  {
   if (*string!='\x0')
   {
    if (*string==' ') d=d+1;
    else d=0;
    c=c+1;
    *string++;
   }
  }
  char*p="";
  for(g=c-i;g>d;g--) // Неверная функция. Копируется подстрока без начальных и           конечных пробелов
   *p++=*(string-g);
   return p;
 }
 
 
void main(void)
 {
  clrscr();
  char*x="      q   w   e r       t     y      ";
  *alltrim(x); //На выходе должно получится  "q   w   e r       t     y"
  
 }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2009, 13:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление лишних пробелов в начале и конце строки. (C++):

Удаление пробелов в начале и конце - C++
Подскажите, пожалуйста, функцию удаление пробелов в начеле и конце строки? Вот примерный код: // есть строка std::string mystr; ...

Отрезание пробелов в начале и в конце строки - C++
Разработайте функцию std::string Trims(std::string const&amp; str), выполняющую отрезание пробелов в начале и в конце строки str, и...

Создание программы со своей библиотекой ( удаление элементов с N по M в строке и удаление лишних пробелов(если 2 и более оставить один)) - C++
добрый день. помогите, пожалуйста понять мои ошибки в работе. Мне нужно написать программу со своей библиотекой, которая включает в себя...

Удаление лишних пробелов - C++
Знаю, тема изъёрзана) но вот код, и своих функций он не выполняет( #include &lt;iostream&gt; using namespace std; int main() {...

Удаление лишних пробелов - C++
Доброго времени суток уважаемые профики С++. Хотелось бы узнать как сделать функцию удаление лишних пробелов? То есть что бы по 1...

Удаление лишних пробелов - C++
И снова здравствуйте, Господа эксперты. Помогите пожалуйста Удалить в тексте лишние пробелы. Данные считать из файла и вывести в файл. Вот...

28
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
04.03.2009, 14:04 #2
попробуй так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
 int from = 0, to = 0;
 char str[256];
 string res = "";
 cout << "enter string:" << endl;
 cin.getline(str, 256);
 for(int i = 0; i < strlen(str); i++){
      if(str[i] != ' '){
        from = i;
        break;
      }
    }
 for(int i = strlen(str) - 1; i >= 0 ; i--){
      if(str[i] != ' '){
        to = i;
        break;
      }
    }
    for(int i = from; i <= to; i++){
      res += str[i];
    }
 cout << res << endl;
 return 0;
}
1
Zion3439
2 / 2 / 0
Регистрация: 04.03.2009
Сообщений: 30
04.03.2009, 14:13  [ТС] #3
Ну мне надо это реализовать с помощью указателей.
0
Lelik
Сообщений: n/a
04.03.2009, 14:21 #4
Можно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <cstdio>
#include <cstring>
#include <cstdlib>
char* alltrim(char* string){
int i, j = 0;
char ReturnString[strlen(string) + 1];
ReturnString[0] = '\0';
// for(i = 0, j; i < strlen(string); i++)
while(*string != '\0'){
if(*string != ' ') ReturnString[j++] = *string;
string++;
}
ReturnString[j] = '\0';
free(string);
string = strdup(ReturnString);
return string;
}
int main(){
// clrscr(); 
char* x = " q w e r t y ";
printf("Input string - %s\nOutput string - %s\n", x, alltrim(x));
system("PAUSE");
return EXIT_SUCCESS;
}
PS Если тебе надо не на С, а на С++, то действительно проще использовать cin и cout
Что неясно, пиши - объясню
Забавно, что у меня в Studio не хочет компилироваться, а Dev C++ нормально относится к strlen(string)
Zion3439
2 / 2 / 0
Регистрация: 04.03.2009
Сообщений: 30
04.03.2009, 14:30  [ТС] #5
Lelik подскажи пожалуйсто:
#include <cstdio>
#include <cstring>
#include <cstdlib>

char* alltrim(char* string)
{
int i, j = 0;
char ReturnString[strlen(string) + 1]; //Что такое ReturnString и strlen?
ReturnString[0] = '\0'; // соответственно что делает вот эта команда?

// for(i = 0, j; i < strlen(string); i++)
while(*string != '\0')
{
if(*string != ' ') ReturnString[j++] = *string;
string++;
}
ReturnString[j] = '\0';

free(string); // Это как я понимаю очищает переменную, или как?
string = strdup(ReturnString); // что такое strdup?
return string;
}

int main()
{
// clrscr();
char* x = " q w e r t y ";
printf("Input string - %s\nOutput string - %s\n", x, alltrim(x));
system("PAUSE");
return EXIT_SUCCESS;
}
PS: Я на эту прогу уже дня 4 угрохал всё одолеть немогу, вечно под самый конец программы возникают проблемы с присвоением полученого результата какойто переменной.%)
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
04.03.2009, 14:32 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <string.h>
#include <alloc.h>
using namespace std;
string trimall1(char* str){
  int from = 0, to = 0;
  string res = "";
  for(int i = 0; i < strlen(str); i++){
    if(str[i] != ' '){
      from = i;
      break;
    }
  }
  for(int i = strlen(str) - 1; i >= 0 ; i--){
    if(str[i] != ' '){
      to = i;
      break;
    }
  }
  for(int i = from; i <= to; i++){
    res += str[i];
  }
  return res;
}
char* trimall2(char* str){
  int from = 0, to = 0, j = 0;
  for(int i = 0; i < strlen(str); i++){
    if(str[i] != ' '){
      from = i;
      break;
    }
  }
  for(int i = strlen(str) - 1; i >= 0 ; i--){
    if(str[i] != ' '){
      to = i;
      break;
    }
  }
  char* res = (char*)malloc((to - from)*sizeof(char));
  memset(res, ' ', (to - from));
  for(int i = from; i <= to; i++){
    res[j++] = str[i];
  }
  return res;
}
int main()
{
    char* str = (char*)malloc(256*sizeof(char));
    cout << "enter string:" << endl;
    cin.getline(str, 256);
    cout <<"1. start_line_" <<trimall1(str)<<"_endline" << endl;
    cout <<"2. start_line_" <<trimall2(str)<<"_endline" << endl;
    return 0;
}
1
Lelik
Сообщений: n/a
04.03.2009, 14:37 #7
char ReturnString[strlen(string) + 1]; - просто создаем статическую переменную типа char длиной, равной длине переданной нам строки + 1 (для нулевого символа).

ReturnString[0] = '\0'; - говорим, что строка пустая ('\0' - это конец строки)

free(string); - ты в main() выделил память под, ее нужно очистить прежде, чем указатель будет указывать на другую область памяти.

string = strdup(ReturnString);

DESCRIPTION
The strdup() function shall return a pointer to a new string, which is a duplicate of the string pointed to by s1. The returned pointer can be passed to free(). A null pointer is returned if the new string cannot be created.

RETURN VALUE
The strdup() function shall return a pointer to a new string on success. Otherwise, it shall return a null pointer and set errno to indicate the error.

ERRORS
The strdup() function may fail if:

[ENOMEM]
Storage space available is insufficient.

Если коротко, то strdup() выделяет память под новую строку и копирует входную, возвращая указатель на выделенную область памяти
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
04.03.2009, 14:44 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
char*alltrim(char*string)
 {
    char *p,*iter;
    while(*string++==' ');
    iter=--string;
    while(*iter)iter++;
    while(*(--iter)==' ');
    p=new char[iter-string+1];
    char *result=p;
    while(string<=iter)*p++=*string++;
    *p=0;
   return result;
 }
 
 
int main(void)
 {
  char*x="      q   w   e r       t     y    ";
  std::cout<<alltrim(x); //На выходе должно получится  "q   w   e r       t     y"
  system("pause");
  return 0;
 }
2
Zion3439
2 / 2 / 0
Регистрация: 04.03.2009
Сообщений: 30
04.03.2009, 15:46  [ТС] #9
Так я попробовал разные ваши способы, но всётаки хотелось бы улучшить свой.
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <alloc.h>

char*alltrim(char*string)
{
int i=0,d=0,c=0,g=0,j=0;
while(*string==' ')
{
c=c+1;
i=i+1;
*string++;
}
while(*string)
{
if (*string!='\x0')
{
if (*string==' ') d=d+1;
else d=0;
c=c+1;
*string++;
}
}
char*p=new char[c-d-i+1];
for(g=c-i;g>d;g--)
p[j++]=*(string-g);
p[j]='\0';
cout<<p; //тут выводит всё как надо - "q w e r t y"(без пробелов по бокам)
return p;

}


void main(void)
{
clrscr();
char*x=" q w e r t y ";
*alltrim(x);
cout<<x; //а тут почему-то уже выводит - " q w e r t y " (с пробелами по бокам)
}
В чём моя ошибка?
0
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
04.03.2009, 16:05 #10
делай так
C++
1
cout<<alltrim(x);
1
Zion3439
2 / 2 / 0
Регистрация: 04.03.2009
Сообщений: 30
04.03.2009, 16:09  [ТС] #11
ООООО, всем огромное человеческое спасибо! Всё заработало =)))
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.03.2009, 01:28 #12
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string.h>
 
/* SqueezeSpaces:  удаляет из s группы пробелов _по краям_ */
int SqueezeSpaces(char *s)
{
    char *startp, *endp;
    
    if (s == NULL)
        return EOF;
    for (startp = s; *startp == ' '; startp++)
        ;
    if (startp-s > 0) {
        endp = startp;
        startp = s;
        while (*startp++ = *endp++)
            ;
    }
    endp = s+strlen(s);
    while (*--endp == ' ')
        *endp = '\0';
    return 1;        
}
лучше, конечно, пробелы в конце сразу определить, а то для длинной строки будет дольше работать
0
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
05.03.2009, 11:16 #13
C++
1
2
    while (*--endp == ' ')
    *endp = '\0';
Дойдет до первого символа,не равного пробелу и заменит его на ноль.
Так вот наверное будет правильней
C++
1
2
    while (*--endp == ' ')
    *++endp = '\0';
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.03.2009, 11:53 #14
Цитата Сообщение от Humanitis
Дойдет до первого символа,не равного пробелу
и всё

а так бесконечный цикл получится на первом пробеле
0
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
05.03.2009, 12:59 #15
Да я про то,что последний символ, не равный пробелу, не стоит заменять нулем.
C++
1
2
3
    while (*--endp == ' ');
 
    *++endp = '\0';
Не заметил,что ты каждый раз заменяешь нулем...думал просто сдвигаешься вниз,а потом заменяешь нулем
0
05.03.2009, 12:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2009, 12:59
Привет! Вот еще темы с ответами:

Удаление лишних пробелов - C++
Помогите пожалуйста с задачей: Разработать алгоритм и программу для удаления лишних пробелов в тексте (лишними считать&gt; 1 пропуска).

Рекурсия. Удаление лишних пробелов - C++
Доброго времени суток! Подскажите как реализовать с помощью рекурсии задачу: описать функцию, которая удаляет из строки все лишние пробелы.

Удаление лишних пробелов из текста - C++
Здравствуйте, нужна помощь в написании конечного автомата. Удаление лишних пробелов из текста нужна написать в конечном автомате. Помогите...

Удаление лишних пробелов с помощью вспомогательного массива - C++
имеется массив. пробелов между словами в первом случае 2 во втором 3. требуется сократить кол-во пробелов до 1 между каждым словом. ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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