Я новичок в программировании, и мне нужно создать программу, в которой вы вводите предложение, и удалять любые повторяющиеся символы, такие как пробел, запятые и т.д. Поэтому моя идея заключалась в том, чтобы печатать только символы, соответствующие моим критериям. Но у меня проблема:
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];
}
}
}
Было бы неплохо, если бы вы сказали мне, что моя ошибка и как ее решить. Спасибо заранее.
Использование cin
будет рассматривать каждое разделенное пробелом слово как один вход, и оно будет хранить только this
поскольку предоставляется одна строка. Используйте cin.getline()
вместо cin
чтобы получить ввод с пробелами.
char a[l];
cin.getline(a, l);
Я немного изменил код для удаления пробелов. Вы также можете редактировать запятые. Используйте 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;
}
Есть две проблемы.
Первый заключается в том, что вы используете оператор >> для ввода предложения. Этот оператор вводит только символы из белого пространства. Поэтому, когда вы входите
"Это примерное предложение"
результат применения оператора
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 ); } );
Посмотрим
#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, вы, вероятно, столкнетесь с проблемой памяти.
Проблема заключается в этом условии:
if(a[i]!=' ' && a[i+1]!=' ')
Когда программа достигает последнего пробела (который вы хотите сохранить), он не выполнит условие a[i] != ' '
И пропустит символ. Вы хотите:
!(a[i] == ' ' && a[i+1] == ' ')
#include <string>
и std :: stringstd::size_t
для размеров.