Редактирование предложения C ++

0

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

input: "Это (например, 5 пробелов) предложение (2 пробела) sample (3spaces)".

но вывод: "Это", а не "Это примерное предложение",

Мой код:

#include <iostream>
#include <string.h>

using namespace std;

int const l=200;
int main ()
{
    char a[l];
    cin >> a;

    int d;

    d=strlen (a);

    int i = 0;
    for(i = 0; i < d; i++)
    {
        if(a[i] != ' ' && a[i+1] != ' ')
        {
            cout<<a[i];
        }
    }
}

Было бы неплохо, если бы вы сказали мне, что моя ошибка и как ее решить. Спасибо заранее.

  • 9
    Используйте #include <string> и std :: string
  • 2
    ... даааа и отступ в свой код. И используйте std::size_t для размеров.
Показать ещё 1 комментарий
Теги:
string
char

5 ответов

1

Использование cin будет рассматривать каждое разделенное пробелом слово как один вход, и оно будет хранить только this поскольку предоставляется одна строка. Используйте cin.getline() вместо cin чтобы получить ввод с пробелами.

char a[l];
cin.getline(a, l);
0

Я немного изменил код для удаления пробелов. Вы также можете редактировать запятые. Используйте std :: string и getline для чтения строк, поскольку >> читает только до пробела. Надеюсь, это поможет.

#include<cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int const l=200;
int main() {
        string a;
        getline(cin,a);
        int d;
        d=a.size();
        int i = 0;
        for(i = 0; i < d; i++) {
                if(a[i]==' ') {
                        cout<<" ";
                        while(a[i]==' ')
                                ++i;
                }
                cout<<a[i];
        }
        cout<<endl;
}
  • 0
    Это работает? модификация я внутри цикла for не кажется хорошей практикой для меня.
  • 0
    Это работает. В действительности, изменение факта делает его эффективным, поскольку пробелы пропускаются и не повторяются дважды. Как только [i] не является пробелом, являющимся концом цикла while, я печатаю символ, который гарантирует, что ни один из символов не пропущен.
Показать ещё 1 комментарий
0

Есть две проблемы.

Первый заключается в том, что вы используете оператор >> для ввода предложения. Этот оператор вводит только символы из белого пространства. Поэтому, когда вы входите

"Это примерное предложение"

результат применения оператора

cin >> a;

будет состоять в том, что массив a будет содержать только слово "Это". Вместо этого оператора вы должны использовать функцию

cin.get( a, l );

Вторая проблема заключается в том, что условие в выражении if неверно. Должно быть

    if ( a[i] != ' ' || a[i+1] != ' ' )
    {
        cout<<a[i];
    }

Также вы можете использовать стандартный алгоритм std :: unique_copy. Например

    std::unique_copy( a, a + std::strlen( s ), std::ostream_iterator<char>( std::cout ),
        []( char c1, char c2 ) { return ( c1 == ' ' && c1 == c2 ); } );
0

Посмотрим

#include <iostream>
#include <string>

using namespace std;

int main ()
{
    string a;
    getline(cin, a);
    for(int i=0;i < a.length();i++)
    {
        if( i+1 < a.length())
        {
            bool whatIwant = !(a[i] == ' ' && a[i+1] == ' ');
            if(whatIwant){ cout<<a[i]; }
        }
        else { cout<<a[i]; }
    }
}

Не лучший или эффективный способ сделать это, но это должно выполнить эту работу. Протестировано и работает.

Обратите внимание, что если вы не поймаете условие я + 1, вы, вероятно, столкнетесь с проблемой памяти.

  • 0
    'i <a.length ()' - проблема
  • 0
    @ DieterLücking, почему?
0

Проблема заключается в этом условии:

 if(a[i]!=' ' && a[i+1]!=' ')

Когда программа достигает последнего пробела (который вы хотите сохранить), он не выполнит условие a[i] != ' ' И пропустит символ. Вы хотите:

 !(a[i] == ' ' && a[i+1] == ' ')
  • 0
    Это только часть проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню