Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/95: Рейтинг темы: голосов - 95, средняя оценка - 4.71
Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 49
1

Удалить из строки все лишние пробелы: в начале, в конце, повторяющиеся

12.05.2011, 17:18. Просмотров 17313. Ответов 16
Метки нет (Все метки)

Дана строка предложение. Удалить из строки все лишние пробелы: в начале, в конце, повторяющиеся.

Не могу понять, как удалить все пробелы в начале и в конце.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include  <stdio.h>
#include <locale.h>
 
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
char str[101];
printf ("Введите строку:");
gets(str);
  int j=1;
  for (int i=1; str[i]!=0; i++) {
     if((str[i] == ' ') && (str[i-1]==' ')) continue;
     str[j++] = str[i];
} 
    if (str[j-1]==' ') j--;
  str[j] = 0;
  printf("Результат:");  puts(str);
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2011, 17:18
Ответы с готовыми решениями:

Исключить пробелы, стоящие в начале и в конце каждой строки
Дан текстовый файл f, состоящий из нескольких строк. Исключить пробелы, стоящие в начале и в конце...

Удалить из файла с текстом все лишние пробелы
удалить из файла с текстом все лишние пробелы. Оставшееся переписать во второй файл

Удалить из файла все однобуквенные слова и лишние пробелы
Дан символьный файл f. Группы символов, разделенные пробелами (одним или несколькими) и не...

Удалить из файла все однобуквенные слова и лишние пробелы
Дан символьный файл f. Группы символов, разделенные пробелами (одним или несколькими) и не...

В символьной строке удалить все лишние подряд идущие пробелы
Помогите написать программу. Все изменения строки производить в том же массиве. Не допускается...

16
jonson
236 / 209 / 84
Регистрация: 18.03.2010
Сообщений: 750
12.05.2011, 17:35 2
создавай второй массив и копируй в него первый пропуская пробелы.
1
dampir_sanek
151 / 149 / 44
Регистрация: 09.02.2010
Сообщений: 407
12.05.2011, 18:00 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include  <stdio.h>
#include <locale.h>
#include <string.h>
 
int main(int argc, char *argv[]) {
    //setlocale(LC_ALL,"");
    char str[101];
    char res[101];
    printf("Введите строку:");
    fgets (str, 101, stdin);
    int j = 0;
    int i;
    for (i = 0; i<strlen(str) ; i++) {
        if (str[i] == ' ')
            continue;
        res[j] = str[i];
        j++;
    }
    printf("\nРезультат:%s", res);
    getchar();
}
1
Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 49
12.05.2011, 18:15  [ТС] 4
Вот только нужно удалить лишние пробелы... Если между словами 5 пробелов, то оставить только один.
0
Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 49
13.05.2011, 10:41  [ТС] 5
Как удалить последний пробел? С остальными программа работает нормально.
Дело в том, что если в конце строки стоит много пробелов, то программа удаляет все, кроме одного.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include  <stdio.h>
#include <locale.h>
#include <string.h>
 
int main(int argc, char *argv[]) {
    setlocale(LC_ALL,"");
    char str[101];
    char res[101];
    printf("Введите строку:");
    fgets (str, 101, stdin);
    int j = 0;
    int i;
    for (i = 0; i<strlen(str) ; i++) {
        if (str[i] == ' ') {
      if (j==0) continue;
      if (str[i+1] == ' ') continue;}
        res[j] = str[i];
        j++;
    }
    printf("\nРезультат:%s", res);
    getchar();
}
0
jonson
236 / 209 / 84
Регистрация: 18.03.2010
Сообщений: 750
13.05.2011, 13:58 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
#include  <stdio.h>
#include <locale.h>
#include <string.h>
 
int main(int argc, char *argv[]) {
    setlocale(LC_ALL,"");
    char str[101] = "";
    char res[101] = "";
    
    printf("Введите строку:");
    fgets (str, 101, stdin);
    
    
    int j = 0;
    int i;
    for (i = 0; i<strlen(str) ; i++) {
        if (str[i] == ' ') 
        {
          if (j==0) continue;
          if (str[i+1] == ' ') continue;
        }
        res[j] = str[i];
        j++;
    }
    i=strlen(res);
    if(res[i-2] == ' ')
        res[i-2] = '\0';
 
    printf("\nРезультат:%s", res);
    getchar();
}
5
Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 49
13.05.2011, 16:31  [ТС] 7
Огромное спасибо!!!
Делала так же, только писала res[i-1]... А почему нужно именно 2 отнимать? Последний символ завершающий ноль, вот я его и отнимала...
0
dampir_sanek
151 / 149 / 44
Регистрация: 09.02.2010
Сообщений: 407
14.05.2011, 15:16 8
А почему нужно именно 2 отнимать? Последний символ завершающий ноль
Lenoriya, последний символ который считает strlen - это '\n'. Читаем Керниган, Ритчи - Язык программрования Си. 2 издание. стр. 43. Соответственно - res[i-2] - это последний пробел в строке.
1
Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 49
14.05.2011, 15:58  [ТС] 9
dampir_sanek, спасибо, книжечку скачаю
0
fasked
Эксперт С++
4997 / 2576 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.05.2011, 16:06 10
Цитата Сообщение от dampir_sanek Посмотреть сообщение
последний символ который считает strlen - это '\n'
как же это у меня получилось?
C
1
2
3
4
5
6
7
8
9
10
fasked@linux-6bdj:~/Documents> cat space.c
#include <stdio.h>
#include <string.h>
 
int main() {
        const char *str = "0123456789\n0123456789";
        printf("%d\n", strlen(str));
}
fasked@linux-6bdj:~/Documents> ./space
21
0
dampir_sanek
151 / 149 / 44
Регистрация: 09.02.2010
Сообщений: 407
14.05.2011, 16:31 11
fasked, нет нет, не в этом смысле. Я имелл ввиду ссылаясь на страницу 43 из Ритчи для строки:
s = "abcd\n" размещенной в памяти как "abcd\n\0" strlen(s) выдаст 5, а не 6. То есть

Цитата Сообщение от Lenoriya Посмотреть сообщение
Последний символ завершающий ноль, вот я его и отнимала...
этот символ - завершающий '\0' - strlen() не учтет. Следовательно и отнимать его не надо.
Далее - fgets считывает из stdin строку в формате "abcd \n" - соответвенно для того, чтобы удалить последний пробел нужно:
C
1
2
3
...
fgets(str, 100, stdin);
str[strlen(str) - 2] = '\0';
и я не говорю ни коем случае, что
C
1
2
str = "\n\n\n\n";
printf("%d", strlen(str));
даст длину 1. Конечно же 4.
1
Neuroart
0 / 0 / 1
Регистрация: 05.11.2015
Сообщений: 9
09.11.2015, 15:43 12
Как модифицировать программу, что бы она удаляла только начальные и последние пробелы?
0
dvpvitas
2 / 2 / 2
Регистрация: 12.03.2015
Сообщений: 47
26.06.2016, 11:32 13
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
#include  <stdio.h>
#include <locale.h>
#include <string.h>
 
int main(int argc, char *argv[]) {
    setlocale(LC_ALL,"");
    char str[101] = "";
    char res[101] = "";
    
    printf("Введите строку:");
    fgets (str, 101, stdin);
    
    
    int j = 0;
    int i;
    for (i = 0; i<strlen(str) ; i++) {
        if (str[i] == ' ') 
        {
          if (j==0) continue;
          if (str[i+1] == ' ') continue;
        }
        res[j] = str[i];
        j++;
    }
    i=strlen(res);
    if(res[i-2] == ' ')
        res[i-2] = '\0';
 
    printf("\nРезультат:%s", res);
    getchar();
}
а код можете написать без оператора continue, пожалуйста, заранее спасибо?
0
CoderHuligan
813 / 539 / 201
Регистрация: 30.06.2015
Сообщений: 2,997
Записей в блоге: 13
26.06.2016, 18:31 14
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
55
56
57
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#define N 256
/*--------------------------*/
char * udal_nach(char *a)
{
   char *b=a;
   while(*b++==' ');
   if(a!=--b)
   {
      --b;
     *b++='\0';
      return strcpy(a, b);
   }
    return a;
}
/*--------------------------*/
char *udal_kon(char *a)
{
  char *b=a;
  b=--b+strlen(a);
  while(*b--==' ');
  b+=2;
  *b='\0';
  return a; 
} 
/*--------------------------*/
char *udal_lishn(char *a)
{
  char *b, *t;
  b = a;
  while(*b)
  {
      while(*b!=' ' && *b)++b;
      if(*b==' '&& *(b+1)==' ')
      {
        t=b+1;
        while(*b==' '&& *b)++b;
        *t='\0';
        strcat(a, b);
        b=t;
      }else ++b;
        
  }
return a;  
}   
int main(void)
{
  setlocale(LC_ALL,"RU");
  char a[N]="   Lorem ipsum     dolor sit amet,    consectetur adipiscing elit   ";
  printf("%s\n",  udal_nach(a) );
  printf("%s\n",  udal_kon(a) );
  printf("%s\n",  udal_lishn(a) );
return (0);
}
0
napkep
0 / 0 / 0
Регистрация: 23.03.2017
Сообщений: 2
23.03.2017, 17:38 15
как изменить код, чтобы все это он делал из файла?
0
legioneroff
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 24
08.02.2019, 16:56 16
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main() {
    char s[100]; int i = 0;
    gets(s);
    while (s[i] != '\0') {
        if (s[i] != ' ' || (s[i] == ' ' && i != 0 && i != strlen(s) && s[i+1] != ' ')) {
            printf("%c", s[i]);
        }
        i++;
    }
}
0
D3m1an
160 / 129 / 60
Регистрация: 11.08.2016
Сообщений: 439
Завершенные тесты: 1
08.02.2019, 17:48 17
napkep, проще всего будет считывать построчно файл и работать с данным кодом без изменений. Начать следует с того, что зациклить код в main и каждую итерацию , вначале считывать строку, а затем идёт код без изменений.
0
08.02.2019, 17:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2019, 17:48

Удалить из текстового файла все лишние пробелы, оставив между словами не более одного пробела
Дано вот такое задание: Дан текстовый файл. Удалить из него все лишние пробелы, оставив между...

В заданной строке удалить все лишние пробелы, заменяя несколько подряд идущих пробелов одним
Добрый день. Столкнулся с проблемой в программе. Пробелы удаляет, но если ввести пробелы перед...

Удалить лишние пробелы из строки, а потом вывести те слова, которые имеют четное количество букв
Было задание: Удалить лишние пробелы из строки, а потом вывести те слова, которые имеют четное...


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

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

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