0 / 0 / 0
Регистрация: 12.01.2018
Сообщений: 19
1

Найти ошибку в коде программы удаления повторных пробелов

24.01.2018, 00:00. Показов 533. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Наверное, этот код - одна большая ошибка, но надо как-то из этого сделать что-то рабочее. Сделать это не используя ссылки, указатели, флажки, goto и что-то такое, что Макконнел считает несовершенным, а так же с помощью switch case

Суть программы - избавиться от повторных пробелов и табуляций в строке. Так же на конце тоже не должно остаться пробелов.
Очень прошу помочь.

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
#include <ctype.h>
#include <stdio.h>
 
void del(char str[]) 
{
  int i, x; //i - счетчик символов в исходной строке, x - счетчик в измененной строке
  while (str[i])
  {
    switch (str[i])
    {
      case '\t':
        str[i]=' ';
      case ' ':
        if (str[i+1]!=' ')
          str[x++]=' ';
        else
          i++;   
      break;
      default:
        str[x++]=str[i];
    }
    if (str [x-1]=' ')
      str [x-1]='\0';
    else 
      str [x]='\0';
  }
 }
 
 
int main()
{
  char str[] = "  Hello      world!    !   !    !      ";
  del(str);
  printf("%sk\n",str);
  return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2018, 00:00
Ответы с готовыми решениями:

Найти ошибку в коде программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Найти ошибку в коде программы
Сегодня начал изучать систему ввода-вывода в C# и тестируя методы столкнулся с небольшой...

Найти ошибку в коде программы
Народ, посмотрите пожалуйста на код, оператор break не прекращает перебор вариантов case и выводит...

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

6
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
24.01.2018, 03:23 2
Как вариант, но между восклицательными знаками пробелы есть, но поскольку условие "избавиться от повторных пробелов", то всё работает корректно, повторных пробелов между ними нет
C
1
2
3
4
5
6
7
8
9
10
int main()
{
    char str[] = "  Hello      world!    !   !    !      ";
    int count = 0;
    for (int i = 1; str[i]; i++)
        if ((str[i] == ' ' && str[i - 1] != ' ') || str[i] != ' ')
            str[count++] = str[i];
    str[count] = '\0';
    printf("%s\n", str);
}
0
36 / 35 / 17
Регистрация: 15.06.2017
Сообщений: 184
24.01.2018, 03:27 3
Где инициализирование переременных i, x?
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
void del(char str[]) 
{
  int i, x; //i - счетчик символов в исходной строке, x - счетчик в измененной строке
  i=strlen(str);
  x=0;
   while (str[i])
  {
    switch (str[i])
    {
      case '\t':
        str[i]=' ';
      case ' ':
        if (str[i+1]!=' ')
          str[x++]=' ';
        else
          i++;   
      break;
      default:
        str[x++]=str[i];
    }
    if (str [x-1]=' ')
      str [x-1]='\0';
    else 
      str [x]='\0';
  }
 }
0
0 / 0 / 0
Регистрация: 12.01.2018
Сообщений: 19
24.01.2018, 09:06  [ТС] 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
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
#include <ctype.h>
#include <stdio.h>
 
void del(char str[]) 
{
  int i=1, x=1; //i - счетчик символов в исходной строке, x - счетчик в измененной строке
    if (str[0]==' ' || str[0]=='\t')
      i--; x--;
 
   while (str[i]!='\0' && i==x) //ищем лишние пробелы
  {
    switch (str[i])
    {
      case '\t': //заменяем табуляцию на пробел
        str[i]=' ';
      case ' ':
        if (str[i-1]!=' ') //если нашли повторный пробел, то выходим
          x++;
      break;
      default:
       x++;
    }
    i++;
    
    while (str[i]!='\0') //создаем новую правильную строку
    {
      switch (str[i])
      {
        case '\t':  //заменяем табуляцию на пробел
          str[i]=' ';
        case ' ':
          if (str[i-1]!=' ') //если предыдущий символ не пробел, то просто добавляем его в новую строку
          str[x++]=' ';
        break;
        default:
           str[x++]=str[i]; 
      }
        i++;
    }
    
    if (str [x-1]==' ') //избавление от пробелов в конце
      str [x-1]='\0';
    else 
      str [x]='\0';
  }
 }
 
 
int main()
{
  char str[] = "       Hello      world!    !   !    !      ";
  del(str);
  printf("k%sk\n",str);
  return 0;
}
0
2487 / 1145 / 707
Регистрация: 25.04.2016
Сообщений: 3,291
24.01.2018, 10:13 5
Цитата Сообщение от Hitoku Посмотреть сообщение
работает корректно
работает не корректно. По крайней мере не во всех случаях. Попробуйте задать
C
1
char str[] = "Hello      world!    !   !    !      ";
0
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
24.01.2018, 11:01 6
stake-k26, действительно, спасибо. Тогда цикл на вот такой можно поменять
C
1
2
for (int i = 0; str[i]; i++)
    if ((i != 0 && str[i] == ' ' && str[i - 1] != ' ') || str[i] != ' ')
0
2487 / 1145 / 707
Регистрация: 25.04.2016
Сообщений: 3,291
24.01.2018, 20:47 7
Ага, или вот, тоже железобетонный вариант:
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
#include <stdio.h>
 
void check_string (char s[])
{
    int i, n=0, inword = 0, words = 0;
    for(i=0; s[i]; i++)
    {
        if (s[i]=='\n' || s[i]==' ' || s[i]=='\t')
        {
            inword = 0;
            if (s[i+1]!=' ' && s[i+1] && words) s[n++] = ' ';
        }
        else if (!inword) inword = words = 1;
 
        if (inword) s[n++] = s[i];
    }
    while (n < i) s[n++]='\0';
}
 
int main (void)
{
    char str1[] = "Hello      world!    !   !    !      ";
    char str2[] = "   Hello      world!    !   !    ! ";
    char str3[] = "   Hello      world!    !   !    !     ";
    char str4[] = "Hello world!    !   !    ! ";
    char str5[] = "     ";
    char str6[] = "  one   ";
 
    check_string(str1);
    check_string(str2);
    check_string(str3);
    check_string(str4);
    check_string(str5);
    check_string(str6);
 
    printf("%s\n", str1);
    printf("%s\n", str2);
    printf("%s\n", str3);
    printf("%s\n", str4);
    printf("%s\n", str5);
    printf("%s\n", str6);
 
    return 0;
}
Добавлено через 9 часов 31 минуту
DUROCHKA, по сути тут вся тонкость в составлении условий, которые будут охватывать все возможные случаи. Если у вас что-то не работает, значит учтены не все условия. Ну и с помощью switch-case такие условия можно реализовать, но слишком уж это ... громоздко, это примерно как пытаться забраться на скалу без снаряжения, когда в двух метрах кто-то уже повесил веревку.

Вообще, на сколько я могу судить, у вас преподаватель "особенный" - все через брутфорс и только через тонны ненужного кода, и никаких компромиссов. Раз великие предки наказали спать в водолазном костюме с медной бандурой на 100 кило на голове, значит так и будет... Глупо, как ни посмотри. Понятно, что таким образом вас искусственно ставят в сложное положение, но как по мне, этого можно и другими способами добиться, не зачем играть в спартанцев, тем более, что в программировании и без того зубодробительных задач, хоть отбавляй, и с каждым годом их число никак не уменьшается.
0
24.01.2018, 20:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2018, 20:47
Помогаю со студенческими работами здесь

Зацикливание программы, найти ошибку в коде
#define EE 1E-80 #define MAX_ROOTS 15 typedef struct { Complex root; int nor; // number...

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

Не могу найти ошибку в коде программы
Лабу задали, сам в программировании ничегошеньки вот уважаемые данный код ...

Неожиданное поведение программы: найти ошибку в коде
Программа запрашивает у пользователя «Сколько Вам лет?» . Вы вводите положительное число до 100....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru